Как создать новые столбцы, используя другие значения столбцов в Python?

#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″.