如何为DataFrame中重复订单号对应的空Ticket列填充对应值?
如何按订单号统一填充Ticket列的空值?
嗨,我懂你现在的困扰啦——想用同一个订单号下已有的Ticket值填补空值,但用fillna(method='ffill')没得到想要的结果对吧?问题出在ffill只会按行的顺序向下填充,如果某个订单的空值出现在非空Ticket的前面(就像你数据里的订单13902和13501那样),它就没办法倒回去把前面的空值补上啦。
给你个靠谱的解决方案:用groupby按订单号分组,然后在每个组内同时做向前填充和向后填充,这样不管空值在组内的哪个位置,都能被同组的有效Ticket值替换。
具体代码如下:
# 按Order number分组,对每组的Ticket列先向前填充再向后填充 df['Ticket'] = df.groupby('Order number')['Ticket'].transform(lambda x: x.ffill().bfill())
为什么这个方法管用?
groupby('Order number')会把相同订单号的行归为一组,每个组的操作互不干扰;ffill()会填充组内位于非空值之后的空值;bfill()会填充组内位于非空值之前的空值;- 两者结合后,同一个订单下的所有空Ticket都会被替换成该订单对应的有效编号,完美匹配你的预期结果。
运行这段代码后,你的DataFrame就会变成:
| Order number | Ticket |
|---|---|
| 13902 | S0-015581 |
| 13902 | S0-015581 |
| 13501 | S0-0012131 |
| 13501 | S0-0012131 |
| 13809 | S0-90-788 |
| 13809 | S0-90-788 |
内容的提问来源于stack exchange,提问作者navya sri
相关产品推荐
相关产品推荐

