我有一些缺少发票号的客户交易数据。如果两行中的客户id相等,并且交易金额相等,我想用前一行的值填充缺失的发票号。日期并不重要。
数据的一个例子是:
date customer amount invoice
01/13 A 10 1
02/13 B 20 2
03/13 B 20 NA
04/13 C 30 3
05/13 C 60 NA
06/13 D 50 4
我试图创建的是:
date customer amount invoice
01/13 A 10 1
02/13 B 20 2
03/13 B 20 2
04/13 C 30 3
05/13 C 60 NA - this NA remains because amount does not match
06/13 D 50 4
Emma的答案是这里的解决方案:(df['invoice'] = df.groupby(['customer', 'amount'])['invoice'].ffill()
(
然而,如果您有一些groupby
无法完成的条件,下面的答案可能会很有用,所以我会保留。
您可以将ffill()
与mask
语句一起有条件地填充:
df['invoice'] = df['invoice'].mask(df.duplicated(['customer', 'amount']),
df['invoice'].ffill())
df
Out[1]:
date customer amount invoice
0 01/13 A 10 1.0
1 02/13 B 20 2.0
2 03/13 B 20 2.0
3 04/13 C 30 3.0
4 05/13 C 60 NaN
5 06/13 D 50 4.0
更新:感谢@David Erickson的评论,为ffinll添加一个特定的列。
您可以使用groupby
和ffill
。
df['invoice'] = df.groupby(['customer', 'amount'])['invoice'].ffill()