计算符合特定条件的Pandas组中的行

时间:2016-01-31 23:00:18

标签: python pandas

我正在尝试向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

1 个答案:

答案 0 :(得分:1)

使用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)

结果与上述相同。这种方法的一个优点是您可以使用docstrings。 此外,您还可以使用lambda无法使用的语句。