在本练习中,我有一个包含订单号,商品ID,公司ID,国家/地区和计数的数据框。
在实践中,我有更多的专栏。现在,我想通过生成我选择的每个列的订单计数的平均值,总和等来自动进行一些计算以进行分析。例如。如果我选择item_id
和company_id
,我希望将它们的平均值作为单独的列。优选地,生成的列标题,例如, item_id_mean
和company_id_mean
。
我知道如何按一列或多列分组。这适用于每个选定的列。但是现在想要根据列选择(通过单独的文件)为更大的列运行它
问题:如何根据列标题列表中的每一列进行分组并计算平均值(或总和)?另外,如何为这些新列生成相应的标题?
我的测试代码:
df_columnselect = pd.DataFrame({'Column':['ordernumber','item_id', 'company_id','country', 'count'],
'Selected':['no','yes','yes','no','no']},
columns=['Column','Selected’])
print(df_columnselect)
Column Selected
0 ordernumber no
1 item_id yes
2 company_id yes
3 country no
4 count no
Selected_Cols=df_columnselect.loc[df_columnselect.Selected=='yes', 'Column']
print(Selected_Cols)
1 item_id
2 company_id
df_orders = pd.DataFrame({'ordernumber':[1,2,3,4,5,6,7,8,9,10],
'item_id': [1, 1, 2, 2, 3, 4, 4, 5, 7, 8],
'company_id':['a','b','c','a','b','c','a','b','c','a'],
'country':[0, 1, 0, 1, 1, 0, 1, 1, 1, 0],
'count':[27, 49, 3, 1, 6, 8, 14, 1, 1, 6] },
columns=['ordernumber','item_id', 'company_id','country', 'count'])
我已根据您的输入尝试了以下操作,但第一个只生成1列并计算错误的平均值。而第二个是正确的平均值,但不会根据选择自动生成新列(Selected_Cols)
df_orders['new_col'] = df_orders.groupby(Selected_Cols)['count'].transform('mean')
df_orders['new_col2'] = df_orders.groupby('item_id')['count'].transform('mean')
print(df_orders)
ordernumber item_id company_id country count new_col new_col2
0 1 1 a 0 27 NaN 38
1 2 1 b 1 49 49.0 38
2 3 2 c 0 3 3.0 2
3 4 2 a 1 1 NaN 2
4 5 3 b 1 6 NaN 6
5 6 4 c 0 8 NaN 11
6 7 4 a 1 14 NaN 11
7 8 5 b 1 1 NaN 1
8 9 7 c 1 1 NaN 1
9 10 8 a 0 6 NaN 6
实际上,这应该是,基于Selected_Cols 中的选择,两个新列(如果选择更多,则为更多列)。 我在这里排除了国家/地区专栏,但这不是问题。
ordernumber item_id company_id count item_id_mean company_id_mean
0 1 1 a 27 38 12.00
1 2 1 b 49 38 18.67
2 3 2 c 3 2 4.00
3 4 2 a 1 2 12.00
4 5 3 b 6 6 18.67
5 6 4 c 8 11 4.00
6 7 4 a 14 11 12.00
7 8 5 b 1 1 18.67
8 9 7 c 1 1 4.00
9 10 8 a 6 8 12.00
我在论坛中四处寻找并测试了一些东西,但找不到任何类似的讨论,根据选择的列来处理新列的生成(平均值,总和等)。
所以基本上我有两个输入文件(csv或其他) 1.原始订单数据 2.列的选择(基于列标题)
我想导出一个文件(再次输入cvs或其他) 1.原始订单数据丰富了每个选定列的计数平均值作为单独的组(即基于选择的每个分组的新列)
解决方案
def FUNCTION(x):
return df_orders.groupby(x)['count'].transform('mean')
df_orders = df_orders.join(df_orders[(Selected_Cols)].apply(FUNCTION).add_suffix('_mean'))
派生自:Creating new column names from a list of strings in a loop