提问人:Manuel Veiga 提问时间:9/28/2023 更新时间:9/28/2023 访问量:29
dropna 用 None 填充所有列,而不仅仅是 NaN 值
dropna is filling all the column with None rather than just the NaN values
问:
使用关于起点和去处的 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)
答:
1赞
mozway
9/28/2023
#1
您需要直接将 replace
和 dropna
组合在一起,而不是在列/系列级别:
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')
上一个:使用写入时复制就地更改列
下一个:通过迭代变量更新进行反向传播
评论
how='any'
dropna