在pandas中用另一行的值替换缺失值

3

我有一个Pandas DataFrame,其中有2列。

enter image description here

我用 NaN 替换了空格以便更快地进行 fillna 等处理:

themes = themes.apply(lambda x: x.str.strip()).replace('', np.nan)

我该如何用其他行的匹配值替换NaN?

以下的解决方案有没有帮到您?如果有,请随意接受其中一个(左侧的绿色勾号),或者要求进一步的澄清。 - jpp
2个回答

4
您需要使用groupbyffillbfill
themes.groupby('code').apply(lambda x : x.ffill().bfill())

1
themes.groupby('code').ffill().bfill() 应该可以工作(除非组内的每个值都是 NaN),而且速度甚至更快。 - cs95
@cᴏʟᴅsᴘᴇᴇᴅ 是的,没错 :-) - BENY
@cs95 这个问题在于,在 ffill() 之后你会失去 'code' 列,然后 pandas 会对所有 NaN 运行 bfill(),而不管 'code'。 - robroc
@robroc 是的,但请考虑这一点:除非给定代码的每行都是NaN,否则前面的"GroupBy.ffill"步骤已经填充了整个组中包括最后一个的所有内容,所以随后的"bfill()"步骤只会填充其自己组内的NaN。由于先前的"ffill"步骤的工作方式,您可以免费获得此功能。当然,有一个注意事项:"除非组内的每个值都是NaN"(那么这个方法不适用,希望您明白原因!)。 - cs95
@c95 是的,但它假设 df 已排序,因此所有分组值都在一起。我尝试过对散布的分组值进行操作,在某些 NaN 值下面得到了任意值。 - robroc
@robroc 这并不是一个不合理的假设,因为 groupby 会按输出中的键进行排序,除非你传递 sort=False,但这样做没有什么意义。 - cs95

4

一种方法是在删除空值后创建一个系列。

然后使用 pd.Series.fillnapd.Series.map

df = pd.DataFrame({'code': [1, 2, 3, 1, 2, 4],
                   'name': ['A', np.nan, 'C', np.nan, 'B', 'D']})

s = df.set_index('code')['name'].dropna()
df['name'] = df['name'].fillna(df['code'].map(s))

print(df)

   code name
0     1    A
1     2    B
2     3    C
3     1    A
4     2    B
5     4    D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接