在其他行中查找连续缺失的匹配项 (Pandas)

Look up in other rows for missing matches in a row (Pandas)

我有一个类似于此的数据框:

df1 = pd.DataFrame({'product': ['widget1', 'widget1', 'widget1', 'widget2', 'widget2', 'widget3', 'widget3', 'widget4'],
               'group': ['group1', 'group1', '', 'group1', '','group2', '', '']})

并想输出这个:

df2 = pd.DataFrame({'product': ['widget1', 'widget1', 'widget1', 'widget2', 'widget2', 'widget3', 'widget3', 'widget4'],
               'group': ['group1', 'group1', '', 'group1', '','group2', '', ''],
               'new group': ['group1', 'group1', 'group1', 'group1', 'group1','group2', 'group2', '']})

以便创建一个新列:

如有任何帮助,我们将不胜感激!谢谢!

试试这组代码:

import numpy as np

df1['group'][df1['group'] == ''] = np.nan          
df1['new group'] = df1.groupby('product')['group'].ffill().bfill()   
df1[['group', 'new group']] = df1[['group', 'new group']].fillna('')

输出结果:

   product   group new group
0  widget1  group1    group1
1  widget1  group1    group1
2  widget1            group1
3  widget2  group1    group1
4  widget2            group1
5  widget3  group2    group2
6  widget3            group2
7  widget4                  

代码的工作原理如下:

第 1 行:暂时将 group 列中的空字符串设置为 nan

第 2 行:按相同的 product 组对行进行分组。然后对于具有相同 product 的每个组,查看列 group 并执行正向填充和反向填充以填充任何 nan 值在组内的两个方向上的任意位置具有非 nan 值.生成的数据系列(现在尽​​可能填充空值)被复制到新列 new group.

第 3 行:将先前转换为 nan 的空字符串重置为空字符串。如果原始数据框中的其他列不包含 nan 值,则可以将这行代码简化为 df1.fillna('')

请注意,这些代码假定每个产品只能有一个可能的组值值(如果有)。如果可以有2个或以上,前向填充和后向填充操作可能会根据多个非空组值的位置得到不同的值。