我有一个pandas数据框,所有值都是字符串。有些是“无”,其余的是整数,但采用字符串格式,例如“ 123456”。如何将所有“无”都转换为np.nan,将其他所有“无”转换为整数,例如123456。
df = {'col1': ['1', 'None'], 'col2': ['None', '123']}
将df转换为:
df = {'col1': [1, NaN], 'col2': [NaN, 123]}
答案 0 :(得分:3)
使用以下代码:
print(df.replace('None', np.nan).astype(float))
输出:
col1 col2
0 1.0 NaN
1 NaN 123.0
您必须使用replace
。
P.S。如果df
是字典,请先将其转换:
df = pd.DataFrame(df)
答案 1 :(得分:3)
您可以将列转换为Nullable Integer类型(0.24以上版本中的新功能):
d = {'col1': ['1', 'None'], 'col2': ['None', '123']}
res = pd.DataFrame({
k: pd.to_numeric(v, errors='coerce') for k, v in d.items()}, dtype='Int32')
res
col1 col2
0 1 NaN
1 NaN 123
使用此解决方案,数字数据将转换为整数(但丢失的数据仍为NaN):
res.to_dict()
# {'col1': [1, nan], 'col2': [nan, 123]}
在旧版本中,初始化DataFrame时转换为object
:
res = pd.DataFrame({
k: pd.to_numeric(v, errors='coerce') for k, v in d.items()}, dtype=object)
res
col1 col2
0 1 NaN
1 NaN 123
它与上面的可为空的类型解决方案不同,只是表示形式发生了变化,而不是实际数据。
res.to_dict()
# {'col1': [1.0, nan], 'col2': [nan, 123.0]}
答案 2 :(得分:1)
您还可以使用:
import pandas as pd
d = {'col1': ['1', 'None'], 'col2': ['None', '123']}
df = pd.DataFrame.from_dict(d).replace("None", value=pd.np.nan).astype(float)
col1 col2
0 1.0 NaN
1 NaN 123.0
col1 1 non-null float64
col2 1 non-null float64
dtypes: float64(2)