我有一个有各种问题的值列它返回一个对象dtype它是这样的
import pandas as pd
data = {'Observation':['1', '2', '3', '4', '5', '6', '7', '8', '9'],
'Value':['5.6' , '1 068,0', '1 956.3', '', 'NaN', '65,0', 'nan', '23,5', '30.0']}
df = pd.DataFrame(data)
主要问题是:
- 混合小数(点和逗号)
- 两种类型的千位分隔符
- 混合NaN和NaN以及na值的空字符串
- 点0或末尾的逗号0
期望的结果是具有正确NaN值的float64数据类型的列
谢谢!
Pandasseries.replace
接受字典和regex
选项:
df['Value'] = pd.to_numeric(df['Value'].replace({' ':'', ',':'.'}, regex=True),
errors='coerce')
输出:
Observation Value
0 1 5.6
1 2 1068.0
2 3 1956.3
3 4 NaN
4 5 NaN
5 6 65.0
6 7 NaN
7 8 23.5
8 9 30.0
你可以这样做:
df['Value'] = pd.to_numeric(df['Value'].str.replace(',', '.').str.replace(' ', ''),
errors='coerce')
输出:
Observation Value
0 1 5.6
1 2 1068.0
2 3 1956.3
3 4 NaN
4 5 NaN
5 6 65.0
6 7 NaN
7 8 23.5
8 9 30.0
首先你需要预处理你的数据,即替换空格,逗号,最后删除nan。我是这样做的。
df['Value']=df['Value'].astype(str)
df['Value']=df['Value'].apply(lambda x:x.replace(' ',''))
df['Value']=df['Value'].apply(lambda x:x.replace(',','.'))
您可以根据数据的描述方式添加其他预处理过程。我将转换过程封装在函数中,以便进一步重用。
def cast_float(x):
try:
return float(x)
except:
return np.NaN
df['Value']=df['Value'].apply(cast_float)