如何在熊猫中用其他 2 个单元格相等的条件转发填充 na?



我有一些缺少发票号的客户交易数据。如果两行中的客户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添加一个特定的列。

您可以使用groupbyffill

df['invoice'] = df.groupby(['customer', 'amount'])['invoice'].ffill()

最新更新