Как я могу обменять строки для нескольких фреймов данных?

У меня есть словарь, в котором каждое значение содержит несколько разных DataFrame, сгруппированных по Name, но я хотел бы сделать так, чтобы вместо этого они были сгруппированы по Time. Я пытаюсь применить функцию типа group-by/apply/split, но поскольку они не являются одним DataFrame (а скорее разделены DataFrames в словаре), я немного застрял.

Игрушечный пример словаря с двумя фреймами данных:

{'df1':    Name  Time
 0  Greg  1-10
 1  Greg  5-10
 'df2':     Name  Time
 0   Jeff  5-10
 1  Jeff  1-10}

Чтобы воспроизвести:

d = {'df1': pd.DataFrame({'Name': ["Jeff", "Greg"], 'Times': ["1-5", "5-10"]}), 'df2': pd.DataFrame({'Name': ["Jeff", "Greg"], 'Times': ["5-10", "1-5"]})}

Желаемый результат:

{'df1':    Name  Time
 0  Greg  1-10
 1  Jeff  1-10
 'df2':     Name  Time
 0  Jeff  5-10
 1  Greg  5-10}

Укажите минимальный воспроизводимый пример.

ddejohn 17.03.2022 05:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC, ваши данные выглядят так, как показано ниже (назовем это data):

{'df1':    Name.  Time
 0  Greg.  1-10
 1  Greg.  5-10,
 'df2':     Name  Time
 0   Jeff  5-10
 1  Jeff.  1-10}

Вот один из вариантов: concat + groupby "Время" + понимание словаря:

out = {f'df{i}': df for i, (_, df) in 
       enumerate(pd.concat((data['df1'].rename(columns = {'Name.':'Name'}), 
                            data['df2'])).groupby('Time'), 1)}

Выход:

{'df1':     Name  Time
 0  Greg.  1-10
 1  Jeff.  1-10,
 'df2':     Name  Time
 1  Greg.  5-10
 0   Jeff  5-10}

Большое спасибо, энке. Будет ли подобный метод работать со словарем из n записей?

Dougie Fresh 17.03.2022 05:51

@DougieFresh, если ваша цель та же, количество значений не имеет значения. Просто убедитесь, что имена столбцов совпадают. Например, в вашем образце столбцы «Имя» не были одинаковыми, поэтому мне пришлось изменить его вручную; в противном случае вы могли бы объединить с простым pd.concat(data.values())

enke 17.03.2022 06:02

@DougieFresh pd.concat(d.values()) просто объединяет все DataFrames, хранящиеся в d, и создает один DataFrame. Мы groupby «Время» в этом DataFrame и перебираем каждую группу, чтобы создать отдельные DataFrames. enumerate используется только для присвоения имен клавиш выходному словарю (с использованием f-строк); это не очень важно; если списка достаточно, вы можете использовать вместо него [df for _, df in pd.concat(d.values()).groupby('Time')].

enke 17.03.2022 06:40

Другие вопросы по теме