带有混合小数的列



我有一个有各种问题的值列它返回一个对象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)

最新更新