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