根据另一列的条件填充 pandas.DataFrame 的 NaN

时间:2021-03-03 13:48:39

标签: python pandas dataframe

我想根据另一列的条件替换 DataFrame 的一列中的 NaN。如果在 [0] 列中有“Passenger-Kilometers”,我想在该行的另一列 [1] 的 NaN 中填充值“Total Passenger Transport”,如 {{1} 的索引 14 } 下面(对于其他 NaN 有一个替代方法,请参阅下面的映射 df)。如果在下面尝试这个循环,它在每种情况下都有效,但我想找到一个更优雅的解决方案。

totals_dict

有没有更干净、更不同的方法来解决这个问题?

或者,我尝试过:

totals_dict = {"Passenger-Kilometers": "Total passenger transport",
               "Freight Ton-Kilometers": "Total freight transport",}
for key, value in totals_dict.items():
    df[df[0] == key] = df[df[0] == key].fillna(value)

但不幸的是,df = df.groupby(0).assign(target_col=lambda group: group["target_col"].fillna(totals_dict.get(group[0]))) 对象不接受 groupby 作为方法。

assign 如下:

df

谢谢!

1 个答案:

答案 0 :(得分:0)

假设我有这个数据框:

>>> a
                      0                                         1
0  Passenger-Kilometers  Civil Aviation(100 million passenger-km)
1  Passenger-Kilometers       Waterways(100 million passenger-km)
2  Passenger-Kilometers                                      None
3  Passenger-Kilometers                                      None
4  Passenger-Kilometers                                      None

然后我可以运行以下命令:

def b(x):
    x[1] = "hello"
    return x
a[(a[0] == "Passenger-Kilometers") & (a[1].isnull())] = a[(a[0] == "Passenger-Kilometers") & (a[1].isnull())].apply(b, axis=1)

现在如果我看:

>>> a
                      0                                         1
0  Passenger-Kilometers  Civil Aviation(100 million passenger-km)
1  Passenger-Kilometers       Waterways(100 million passenger-km)
2  Passenger-Kilometers                                     hello
3  Passenger-Kilometers                                     hello
4  Passenger-Kilometers                                     hello

所以你可以用你需要的任何东西替换“hello”