我有一个 pandas 数据框,如下所示。
d = {'emp': ['a', 'a', 'a', 'b', 'b', 'b'], 'vendor': ['x', 'x', 'y', 'z', 'z', 'z'], 'date': [1,1,2,3,3,3], 'amount': [4.9, 4.8, 1, 6, 5.6, 5.4]}
df = pd.DataFrame(data=d)
df["rounds"]=np.ceil(df['amount'])
df
amount date emp vendor rounds
0 4.9 1 a x 5.0
1 4.8 1 a x 5.0
2 1.0 2 a y 1.0
3 6.0 3 b z 6.0
4 5.6 3 b z 6.0
5 5.4 3 b z 6.0
我想创建一个 example
列,如果相同的 emp
花费相同的金额(列 rounds
),该列将有一个唯一的数字在同一天的同一 vendor
。
一个员工可能有多个交易符合这个标准,或者他们可能有 0 个交易符合这个标准
我该如何继续?
example
1
1
2
2
2
当example
列中的数字相同时,表示属于一组的所有事务
另一个例子
如果我的数据框如下所示
d = {'emp': ['a', 'a', 'a', 'a', 'b', 'b'], '供应商': ['x', 'x ', 'y', 'y', 'z', 'z'], '日期': [1,1,2,2,3,3], '金额': [4.9, 4.8, 1, 1, 5.6, 5.4]}
然后 example
列的值应为“1,1,2,2,3,3”
最佳答案
duplicated
在 transform
中调用,duplicated 将查找每个组中供应商的重复项目数量,然后我们将它们相加,应该可以达到您的需要, transform你可以查看链接
df.groupby(['date','emp','rounds']).vendor.transform(lambda x : x.duplicated().sum())
Out[806]:
0 1
1 1
2 0
3 2
4 2
5 2
Name: vendor, dtype: int64
分配回来后
df['example']=df.groupby(['date','emp','rounds']).vendor.transform(lambda x : x.duplicated().sum())
#yield
df
Out[808]:
amount date emp vendor rounds example
0 4.9 1 a x 5.0 1
1 4.8 1 a x 5.0 1
2 1.0 2 a y 1.0 0
3 6.0 3 b z 6.0 2
4 5.6 3 b z 6.0 2
5 5.4 3 b z 6.0 2
更新:
df['key']=tuple(zip(df.emp,df.vendor,df.date,df.rounds))
df[df.duplicated('key',keep=False)].groupby('key').ngroup()+1
Out[831]:
0 1
1 1
2 2
3 2
4 3
5 3
dtype: int64
关于python pandas 查找相同金额的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49884072/