我正在尝试将 NaN 填充到多个列中(对于解决方案来说太多了,无法硬编码),这些列的名称的一部分与同一 pandas 数据框中另一列的值共享。
我知道我可以使用常量值填充多列,也可以使用同一数据框中的另一列填充单个列。这两者的结合对我不起作用。
例如,考虑数据框:
df = pd.DataFrame({'Val': [1.2,5.4,3.1,4], 'Col - 1': [None,5,1,None], 'Col - 2': [None,None,6,None]})
print(df)
Val Col - 1 Col - 2
0 1.2 NaN NaN
1 5.4 5.0 NaN
2 3.1 1.0 6.0
3 4.0 NaN NaN
用常量值填充多个列是可行的:
df.loc[:,df.columns.str.contains('Col')] = df.loc[:,df.columns.str.contains('Col')].fillna(value=15)
print(df)
Val Col - 1 Col - 2
0 1.2 15.0 15.0
1 5.4 5.0 15.0
2 3.1 1.0 6.0
3 4.0 15.0 15.0
用另一列的值填充单个列也可以:
df['Col - 2'] = df['Col - 2'].fillna(value=df['Val'])
print(df)
Val Col - 1 Col - 2
0 1.2 NaN 1.2
1 5.4 5.0 5.4
2 3.1 1.0 6.0
3 4.0 NaN 4.0
两者的结合是行不通的:
df.loc[:,df.columns.str.contains('Col')] = df.loc[:,df.columns.str.contains('Col')].fillna(value=df['Val'])
上面什么都不做,返回原始数据框。我期待的是:
Val Col - 1 Col - 2
0 1.2 1.2 1.2
1 5.4 5.0 5.4
2 3.1 1.0 6.0
3 4.0 4.0 4.0
请您参考如下方法:
你应该添加 apply lambda ,因为数据框 fillna 也会检查 columns name ,你填写它通过 pd.Series,它与 columns 不匹配,所以会导致 fillna 失败
df.loc[:,df.columns.str.contains('Col')].apply(lambda x : x.fillna(value=df['Val']))
