在所选列的列表上运行计算

时间:2018-03-13 12:56:44

标签: python pandas dataframe

在本练习中,我有一个包含订单号,商品ID,公司ID,国家/地区和计数的数据框。

在实践中,我有更多的专栏。现在,我想通过生成我选择的每个列的订单计数的平均值,总和等来自动进行一些计算以进行分析。例如。如果我选择item_idcompany_id,我希望将它们的平均值作为单独的列。优选地,生成的列标题,例如, item_id_meancompany_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

0 个答案:

没有答案