在其他行中查找连续缺失的匹配项 (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', '']})
以便创建一个新列:
- 如果不是 nan
,则填充第二列中的值
- 对于 nan,将针对第一列中的相应值以及该值与第 2 列匹配的任何其他行中该第一列值的任何匹配项进行查找,如果是,则将其拉入值到新列
- 如果找到 none,保留为空
如有任何帮助,我们将不胜感激!谢谢!
试试这组代码:
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个或以上,前向填充和后向填充操作可能会根据多个非空组值的位置得到不同的值。
我有一个类似于此的数据框:
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', '']})
以便创建一个新列:
- 如果不是 nan ,则填充第二列中的值
- 对于 nan,将针对第一列中的相应值以及该值与第 2 列匹配的任何其他行中该第一列值的任何匹配项进行查找,如果是,则将其拉入值到新列
- 如果找到 none,保留为空
如有任何帮助,我们将不胜感激!谢谢!
试试这组代码:
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个或以上,前向填充和后向填充操作可能会根据多个非空组值的位置得到不同的值。