#python #pandas
Вопрос:
Мне нужно создать столбцы на основе значений других столбцов в качестве dictionary. df
Period Category Sub_Category
FY18Q1 Clothing Shirt
FY18Q2 Clothing Trouser
FY18Q1 Clothing Shirt
FY18Q3 Clothing Pant
FY18Q1 Accessories Watch
FY18Q2 Accessories Muff
FY18Q2 Accessories Watch
FY18Q3 Accessories Chains
df_output:
Category Period_Subcategory
Clothing {'FY18Q1':'Shirt','FY18Q2':'Trouser','FY18Q3':'Pant'}
Accessories {'FY18Q1':'Watch','FY18Q2':['muff','Watch'],'FY18Q3':'Chains'}
Ответ №1:
Один лайнер
>>> df2 = df.groupby(by=["Category", "Period"]).agg(lambda x: list(set(x))).reset_index().groupby("Category").apply(lambda x: dict(zip(x["Period"], x["Sub_Category"])))
>>> df2
Category
Accessories {'FY18Q1': ['Watch'], 'FY18Q2': ['Watch', 'Muf...
Clothing {'FY18Q1': ['Shirt'], 'FY18Q2': ['Trouser'], '...
dtype: object
>>> df2.values
array([{'FY18Q1': ['Watch'], 'FY18Q2': ['Watch', 'Muff'], 'FY18Q3': ['Chains']},
{'FY18Q1': ['Shirt'], 'FY18Q2': ['Trouser'], 'FY18Q3': ['Pant']}],
dtype=object)
Комментарии:
1. Вы хотите
groupby(..., sort=False)
сохранить первоначальный заказ «Одежда», «Аксессуары».2. Спасибо. Также структура значений в столбце словаря, запрошенная OP, не была согласована (ни строка, ни список).
Ответ №2:
Напишите функцию, которая создает словарь, и примените ее к вашему фрейму данных, сгруппированному по категориям:
def make_dict(df):
d = {}
for period in sorted(set(df.Period)):
d[period] = list(set(df.Sub_Category[df.Period == period]))
return d
df_output = df.groupby('Category').apply(make_dict)
Ответ №3:
Я почти могу сделать это с помощью:
pd.DataFrame.from_records( [(a,dict(zip(g['Period'],g['Sub_Category'])) ) for (a,g) in df.groupby('Category', group_keys=False)], columns=['Category','Period_Subcategory'] ).set_index('Category')
Period_Subcategory
Category
Accessories {'FY18Q1': 'Watch', 'FY18Q2': 'Watch', 'FY18Q3': 'Chains'}
Clothing {'FY18Q1': 'Shirt', 'FY18Q2': 'Trouser', 'FY18Q3': 'Pant'}
…за исключением того, что pd.DataFrame.from_records()
это не создает список, поэтому он неправильно обрабатывает дубликат для «Аксессуаров»,»FY18Q2″.