繁体   English   中英

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

[英]Fill NaNs of pandas.DataFrame based on condition over another column

我想根据另一列的条件替换 DataFrame 的一列中的 NaN。 如果在列[0]中有“乘客公里”,我想在该行用值“总客运量”填充另一列[1]的 NaN,如下面df的索引 14 所示(有替代对于其他 NaN,请参阅下面的映射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如下:

                       0                                         1
1          Vehicle Stock                Medium Trucks(10000 units)
2          Vehicle Stock                 Heavy Trucks(10000 units)
3          Vehicle Stock                       Trucks(10000 units)
4          Vehicle Stock      Mini Passenger Vehicles(10000 units)
5          Vehicle Stock     Small Passenger Vehicles(10000 units)
6          Vehicle Stock    Medium Passenger Vehicles(10000 units)
7          Vehicle Stock                 Light Trucks(10000 units)
8          Vehicle Stock     Large Passenger Vehicles(10000 units)
9          Vehicle Stock               Civil Vehicles(10000 units)
10  Passenger-Kilometers  Civil Aviation(100 million passenger-km)
11  Passenger-Kilometers       Waterways(100 million passenger-km)
12  Passenger-Kilometers        Highways(100 million passenger-km)
13  Passenger-Kilometers        Railways(100 million passenger-km)
14  Passenger-Kilometers                                      None
15         Vehicle Stock           Passenger Vehicles(10000 units)

谢谢!

假设我有这个 dataframe:

>>> 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM