dropna 用 None 填充所有列,而不仅仅是 NaN 值

dropna is filling all the column with None rather than just the NaN values

提问人:Manuel Veiga 提问时间:9/28/2023 更新时间:9/28/2023 访问量:29

问:

使用关于起点和去处的 DataFrame,有点像 Uber 应用程序。

它给了我一个 DataFrame,其中包含 2 列,其中包含许多 NaN 值:其中一些是 NaN,另一些是写为“nan”的字符串类型。如何编写的一个例子可能是这样的:

data = [
    ["Sevilla","Granada"],
    ["nan","Madrid"],
    ["Burgos",NaN],
    ["Badajoz","Valencia"],
    [NaN,NaN],
    [NaN,"nan"],
    [NaN,"Barcelona"]
    ]
    df = pd.DataFrame(
        data,
        columns=["start_station_name", "end_station_name"],
    )
    print(df)

因此,您应该同时消除“nan”和 NaN。主要问题是,当我使用 .dropna(inplace=True) 时,它会消除所有值并显示为无,我如何保留好的值?

我尝试过以下方法。

首先,我已将所有“nan”替换为 NotaNumbers 的 not NaN 值。 其次,我删除了所有 NaN 值,同时保留了城市名称。

    df["start_station_name"] = df["start_station_name"].replace("nan",np.nan)
    df["end_station_name"] = df["end_station_name"].replace("nan",np.nan)

    df["start_station_name"] = df["start_station_name"].dropna(inplace=True)
    df["end_station_name"] = df["end_station_name"].dropna(inplace=True)

    print(df[["start_station_name","end_station_name"]])

它仅显示 None(因此所有值均为 None)

python 数据帧 就地 替换 nan

评论

0赞 mozway 9/28/2023
您能否提供确切的预期输出以确保没有歧义?
0赞 Manuel Veiga 9/28/2023
是的,我期待的是:[[ [“塞维利亚”,“格拉纳达”],[“巴达霍斯”,“瓦伦西亚”]] 对不起,如果它写得不正确,我还不知道如何写输出。
0赞 mozway 9/28/2023
编辑问题;)
0赞 mozway 9/28/2023
但是,您希望在 中使用 中的默认值。我会更新答案how='any'dropna

答:

1赞 mozway 9/28/2023 #1

您需要直接将 replacedropna 组合在一起,而不是在列/系列级别:

out = df.replace('nan', float('nan')).dropna()

输出:

  start_station_name end_station_name
0            Sevilla          Granada
3            Badajoz         Valencia

您的原始方法不起作用,因为您单独删除了每列的 NaN,但是在插入回 DataFrame 时会重新索引这些列,从而重新创建 NaN。

原答案中的注释

(不需要,但只是留在这里,以防对其他人有用)

如果出于某种原因,您想保留现有的字符串,但仍然使用它们来删除所有值均为 NaN/'nan' 的行:'nan'

out = df[df.replace('nan', float('nan')).notna().any(axis=1)]

输出:

  start_station_name end_station_name
0            Sevilla          Granada
1                nan           Madrid  # notice the 'nan'
2             Burgos              NaN
3            Badajoz         Valencia
6                NaN        Barcelona

评论

0赞 Manuel Veiga 9/28/2023
谢谢!我有几个问题,当你使用替换时,你为什么写而不写?float("nan")np.nan
0赞 mozway 9/28/2023
@ManuelVeiga是一样的。 不需要导入 numpy。float('nan')