У меня есть словарь, в котором каждое значение содержит несколько разных 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}
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 записей?
@DougieFresh, если ваша цель та же, количество значений не имеет значения. Просто убедитесь, что имена столбцов совпадают. Например, в вашем образце столбцы «Имя» не были одинаковыми, поэтому мне пришлось изменить его вручную; в противном случае вы могли бы объединить с простым pd.concat(data.values())
@DougieFresh pd.concat(d.values())
просто объединяет все DataFrames, хранящиеся в d
, и создает один DataFrame. Мы groupby
«Время» в этом DataFrame и перебираем каждую группу, чтобы создать отдельные DataFrames. enumerate
используется только для присвоения имен клавиш выходному словарю (с использованием f-строк); это не очень важно; если списка достаточно, вы можете использовать вместо него [df for _, df in pd.concat(d.values()).groupby('Time')]
.
Укажите минимальный воспроизводимый пример.