我正在尝试向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
答案 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
无法使用的语句。