我正在尝试在DataFrame中添加一列,以指示客户在订单中包含10个以上项目的次数。

我的代码当前如下所示:

import pandas as pd


my_data = {'customer_id' : ['101A', '101A', '104B', '102A', '101A', '104B', '102A', '104B', '101A', '102A' ],
      'date' : ['20120321','20120201','20120123','20111218','20111209','20111127','20111118','20111012','20111001','20110921'],
      'invoice_amt' : [654.76, 234.45, 99.45, 767.63, 124.76, 346.87, 652.65, 765.21, 275.76, 532.21 ],
      'no_line_items' : [19, 24, 6, 2, 6, 4, 18, 10, 18, 8]}


data_df = pd.DataFrame(my_data).sort_index(by='date',ascending=True)


找出每位客户每张发票的最大物品数:

data_df['max_line_items'] = data_df.groupby('customer_id')['no_line_items'].transform(lambda x: x.max())


找出项目大于或等于10的每个客户的发票数量:

data_df['no_vip_invoices'] = data_df.groupby('customer_id')[data_df['no_line_items']>10].transform(lambda x: x.count())


我理想的输出是:

  customer_id      date  invoice_amt  no_line_items  max_line_items   no_vip_invoices
9        102A  20110921       532.21              8              18         1
8        101A  20111001       275.76             18              24         3
7        104B  20111012       765.21             10              10         0
6        102A  20111118       652.65             18              18         1
5        104B  20111127       346.87              4              10         0
4        101A  20111209       124.76              6              24         3
3        102A  20111218       767.63              2              18         1
2        104B  20120123        99.45              6              10         0
1        101A  20120201       234.45             24              24         3
0        101A  20120321       654.76             19              24         3


目前收到错误

KeyError: 'Columns not found: True'


任何帮助将不胜感激,

谢谢

V

最佳答案

使用lambda

这为您提供了所需的输出数据帧:

grouped = data_df.groupby('customer_id')
data_df['max_line_items'] = grouped['no_line_items'].transform(lambda x: x.max())
data_df['no_vip_invoices'] = grouped['no_line_items'].transform(lambda x: len(x[x>10]))


print(data_df.to_string())


输出:

  customer_id      date  invoice_amt  no_line_items  max_line_items  no_vip_invoices
9        102A  20110921       532.21              8              18                1
8        101A  20111001       275.76             18              24                3
7        104B  20111012       765.21             10              10                0
6        102A  20111118       652.65             18              18                1
5        104B  20111127       346.87              4              10                0
4        101A  20111209       124.76              6              24                3
3        102A  20111218       767.63              2              18                1
2        104B  20120123        99.45              6              10                0
1        101A  20120201       234.45             24              24                3
0        101A  20120321       654.76             19              24                3


使用def

如果您不喜欢或不想使用lambda,则可以始终使用常规功能:

def by_max(group):
    """Group by maximum.
    """
    return group.max()

def by_len(group):
    """Group by length greater 10.
    """
    return len(group[group>10])

data_df['max_line_items'] = grouped['no_line_items'].transform(by_max)
data_df['no_vip_invoices'] = grouped['no_line_items'].transform(by_len)


结果与上面相同。这种方法的优点之一是可以使用文档字符串。
此外,还可以使用lambda无法实现的语句。

关于python - 计算符合特定条件的 Pandas 组中的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35120607/

10-10 17:16