Pandas fillna bfill-fill基于另一个专栏中的内容


df['Example'] = df.groupby('Reference')['Example'].fillna(method='ffill')

我可能走错了路。我一直在使用上面的代码在我的数据框架中为其他列填充nan。这对于填补缺失信息非常有效。但后来我遇到了一个问题,这个问题无法填补缺失的值。我现在想解决的问题是这样的所以我只想在Beta版上填写dept字段的空白,但我想用"描述"为"外包"的行中的dept值来填充它们。我看到了几个条件填充的例子,但没有一个适用于我的情况编辑了表格,尽量减少混乱。我以前没有很好地表达我的问题。我要找的是,如果新闻栏包含测试版,那么它会在其中寻找外包的行。它使用外包的部门来填写发票上其他有相同工作#的nan。但不会填满任何其他奶奶。

我的数据帧:

发票INV0001作业#3045lpha副本>INV0001作业#3045Alpha定INV0002作业3055NV0002INV0002作业号3055eta版现场调查INV0002INV0002作业#3056测试版INV0002INV0003作业#3067增量定INV0004第3042号作业eta版现场调查//tr>INV0004INV0004作业#3042测试版INV0005作业#3058Ceta装>

如果我理解得对,这应该能解决你的问题。可能有一种更有效的方法不需要迭代。但它确实起到了作用,应该很容易理解:

import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO('''
Invoice Reference   Press   Description Dept
INV0001 Job#3045    Alpha   Copies  
INV0001 Job#3045    Alpha   Binding 
INV0002 Job#3055    Beta    Design  
INV0002 Job#3055    Beta    Outsource   Digital
INV0002 Job#3055    Beta    Site Survey 
INV0002 Job#3056    Beta    Packaging   
INV0002 Job#3056    Beta    Mounting Brackets   Sign
INV0002 Job#3056    Beta    Installation    Sign
INV0003 Job#3067    Delta   Binding Bond
INV0004 Job#3042    Beta    Site Survey 
INV0004 Job#3042    Beta    Outsource   Color
INV0004 Job#3042    Beta    Design  
INV0005 Job#3058    Ceta    Installation    Sign
'''), sep="t")
df.set_index(["Reference", "Press", "Description"], inplace=True)
for (ref, press, descr) in df[df.Dept.isna()].index:
if press=="Beta" and (ref, press, "Outsource") in df.index:
df.loc[(ref,press,descr)].Dept = df.loc[(ref, press, "Outsource")].Dept
else:
df.loc[(ref,press,descr)].Dept = "" 
df.reset_index(inplace=True)
参考>描述<1th>部门副本阿尔法绑定测试版设计数字版作业号3055>数字测试版现场调查数字版包装测试版安装支架标志测试版安装签署增量绑定债券测试版外包作业号3042作业#3058>
索引发票
0INV0001作业号3045Alpha
1INV0001作业#3045
2INV0002作业号3055
3INV0002测试版外包
4INV0002作业号3055
5INV0002作业#3056测试版
6INV0002作业#3056
7INV0002作业#3056
8INV0003作业#3067
9INV0004
10INV0004作业号3042颜色
11INV0004测试版设计颜色
12INV0005Ceta安装签名
df.groupby('Invoice').apply(lambda x:x.ffill().bfill())
Invoice Press   Description Dept
0   INV0001 Alpha   Something   NaN
1   INV0002 Beta    Something   Digital
2   INV0002 Beta    Outsource   Digital
3   INV0002 Beta    Something   Digital
4   INV0003 Delta   Something   Color
5   INV0004 Beta    Something   Color
6   INV0004 Beta    Outsource   Color
7   INV0004 Beta    Something   Color
8   INV0005 Ceta    Other       Sign

最新更新