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