Python pandas str.replace-如果正则表达式在将字符串转换为数字时未能避免NaN,则保持当前值
我有一列格式化为字符串的值,有些包含逗号,例如:Python pandas str.replace-如果正则表达式在将字符串转换为数字时未能避免NaN,则保持当前值,python,regex,pandas,replace,Python,Regex,Pandas,Replace,我有一列格式化为字符串的值,有些包含逗号,例如: 0 20,7 1 22 2 21 3 20 4 24,4 5 23,8 6 23,6 7 21,6 8 24,3 9 23,3 10 24,2 .... 17053 16 17054 16 17055 15 17056 15 17057 19 17058 17 17059 18
0 20,7
1 22
2 21
3 20
4 24,4
5 23,8
6 23,6
7 21,6
8 24,3
9 23,3
10 24,2
....
17053 16
17054 16
17055 15
17056 15
17057 19
17058 17
17059 18
17060 19
17061 20
17062 21
17063 20
我想把它们转换成float
现在,我不能直接应用astype或to_numeric方法,否则将不会解释字符串20,7
奇怪的是,如果将.str.replace'、'、'.'应用于不包含该模式的字符串,正则表达式将失败,并返回NaN。如果找到模式,我会期望替换,否则返回原样的值
我还尝试了.str.replace','',regex=False,但没有成功
例如:
对于像20,7这样的值,将点替换为逗号效果很好,然后我可以将其转换为数字,得到一个浮点数20.7
但我也有这些价值观:
test['TMEDIA °C'][-10:]
17054 16
17055 15
17056 15
17057 19
17058 17
17059 18
17060 19
17061 20
17062 21
17063 20
然后应用str.replace,我得到:
test['TMEDIA °C'][-10:].str.replace(',', '.')
17054 NaN
17055 NaN
17056 NaN
17057 NaN
17058 NaN
17059 NaN
17060 NaN
17061 NaN
17062 NaN
17063 NaN
test['TMEDIA °C'][-10:].astype(float)
17054 16.0
17055 15.0
17056 15.0
17057 19.0
17058 17.0
17059 18.0
17060 19.0
17061 20.0
17062 21.0
17063 20.0
无法将astype应用于整个列,而是希望得到以下结果:
test['TMEDIA °C'][-10:].str.replace(',', '.')
17054 NaN
17055 NaN
17056 NaN
17057 NaN
17058 NaN
17059 NaN
17060 NaN
17061 NaN
17062 NaN
17063 NaN
test['TMEDIA °C'][-10:].astype(float)
17054 16.0
17055 15.0
17056 15.0
17057 19.0
17058 17.0
17059 18.0
17060 19.0
17061 20.0
17062 21.0
17063 20.0
这是str.replace的错误,或者如果正则表达式失败,我如何保持当前值?很可能您有一个数据类型混合的列,如下所示:
fails = pd.DataFrame([['1,2'], [3]], columns=['a'])
print(fails['a'].str.replace(',', '.')) # results in NaN
专栏是如何结束的,这是另一个问题。如果你有:
works = pd.DataFrame([['1,2'], ['3']], columns=['a'])
然后它就起作用了
例如,如果连接两个数据帧,则可能会出现混合数据类型:
df1 = pd.DataFrame([['1,2']], columns=['a'])
df2 = pd.DataFrame([[3]], columns=['a'])
fails = pd.concat([df1, df2])
如果df2是由read_csv生成的,并且没有值,那么它会自动解析为数字,而不是字符串(例如)
您可以通过在与其他数据帧连接之前在包含逗号值的数据帧(此处为df1)上使用.str.replace来避免NaN问题,或者通过确保其他数据帧(此处为d2['a']的列具有dtype=str)来避免NaN问题,例如,通过read_csv…,dtype=str。替换具有dtype int后具有NaN的数据帧,那就换一个吧。在调用str.replace之前,请尝试强制将整个列转换为str
不,它无论如何都会失败,无法将字符串转换为浮点。我的问题的一个解决方案是测试['TMEDIA°C']。applylambda x:strx.replace',',','。。astypefloat但我正在等待将其作为答案发布,因为我希望更好地了解pandas的srt.replace方法是否也可以在找到结果时显示结果。1 str.replace','在我的系统pandas 0.25上运行良好。2你也许可以解决你的pd问题。阅读“\u csvthousands=”,“@QuangHoang by works fine你的意思是不包含逗号的值会被保留,你不会得到NaN?这正是我的意思。看到了吗?我确实连接了。你是对的,混合数据类型。我迷失了方向,因为我看到所有列都有一个dtypeÒ对象,尽管所有值都是相同类型的实例,但它是整数和逗号的混合体。谢谢您的解释。@user305883那么解决此问题的最佳方法是,在连接之前,在此处使用df1值对数据帧进行清理,即使用.str.replace,或者为不使用df2的数据帧指定dtype=str读取\u csv,或者在按照我所说的顺序连接优先级之前转换为str。如果它解决了你的问题,请考虑接受其中一个答案,所以问题被标记为解决。你是对的。请考虑接受其中一个答案,以便问题被标记为已解决。我发现你的答案清楚地解释了如何处理数据的良好实践;上面安迪的回答是一个简短有效的解决方案,解释了我为什么要会见南。我发现这两种方法都很有用,我认为它们都是正确的。我很困惑,根据StackOverflow的说法,我应该将提供更广泛理解的答案标记为正确答案,是指向问题的又一个pin点,还是我首先阅读的那个。。?我在这里评论是因为我不想冒犯你,也不想拖延你you@user305883你应该接受你用来解决问题的答案。建议您通过在执行替换之前将列转换为str来解决此问题,而我建议通过在与另一个数据帧连接之前对一个数据帧执行替换来避免此问题,或者确保两个数据帧在连接之前都有dtype=str,例如通过read_csvdtype=str。无论您最终选择哪种解决方案,您都应该接受。无论如何,这是您的问题,所以您可以选择您接受的答案作为问题的解决方案。没有人会为此感到生气,这就是网站的工作方式。我们在这里主要是为了提供帮助,而不是收集要点:-如果您真的很难确定其中一个答案,您还可以使用以下选项:python-c import random;printrandom.choice['Andy L.','a_guest']让Python决定一个Python问题可能是尽可能公平的-请不要只发布代码作为答案,而是解释代码的作用以及如何解决问题。带有解释的答案通常质量更高,更有可能吸引更多的选票。