如何在 pandas 中添加字符串数字

3
我有以下数据框:
df = pd.DataFrame({
    'col_1': [0, 1, 2, 3],
    'col_2': [4, 5, 6, 7],
    'col_3': [14, 15, 16, 19]
})

我尝试将数字转换为字符串,然后将每行组合成一个字符串。

我可以使用以下方法实现:

df.apply(lambda x : ''.join(x.astype(str)),1) 

Out[209]: 
0    0414
1    1515
2    2616
3    3719
dtype: object# notice here dtype is object

这是问题

然后,我尝试使用sum函数。

df.astype(str).sum(1)
Out[211]: 
0     414.0
1    1515.0
2    2616.0
3    3719.0
dtype: float64

注意这里的 dtype 变成了 float 而不是 object


更多信息如下:

df.astype(str).applymap(type)
Out[221]: 
           col_1          col_2          col_3
0  <class 'str'>  <class 'str'>  <class 'str'>
1  <class 'str'>  <class 'str'>  <class 'str'>
2  <class 'str'>  <class 'str'>  <class 'str'>
3  <class 'str'>  <class 'str'>  <class 'str'>

为什么"sum"函数会有这种奇怪的行为?有没有办法阻止它将 "str" 转换回 "float"?谢谢你的帮助 :-)

2
请查看此解释 - jezrael
@jezrael 谢谢!!!那个奇怪的 try except 让这个…… - BENY
1
是的,如果您将您的问题标记为重复,那是没有问题的。 - jezrael
@jezrael,继续吧,伙计!:-) 请将其标记为重复。~ - BENY
2个回答

2

如果您想使用某些功能,可以尝试以下方法:

df.astype(str).apply(lambda x: x.sum(),1)

输出:

0    0414
1    1515
2    2616
3    3719
dtype: object

很好,这个方法也可以,但是我不知道为什么我的方法不起作用...让我很困惑... - BENY
基本上,只使用 sum 函数,它会将字符串 number 粘合在一起,然后再将其转换回数字...我尝试找到一种阻止这个自动过程的方法,但失败了... - BENY
在执行 pd.DataFrame.sum 方法和 pd.Series.sum 方法时,必须传递某些参数。 - Scott Boston
是的,我尝试了一下,它的工作结果符合我们的预期。顺便说一下,通过阅读pandas的文件,我找不到哪里提到了DataFrame sum具有这种行为... - BENY
就像我说的,如果内容只包含数字类型,它就会被转换为数字。希望我的回答简洁明了。另一个回答则过于深入。 - Bharath M Shetty
显示剩余4条评论

2

由于返回的序列只包含数字,因此使用标准函数时,Sum 无法正常工作并将其转换为相应的浮点数 dtype 格式。只有在应用标准函数时出现混合数据类型时,它才会是 object

例如,当您执行以下操作时:

df = pd.DataFrame({
    'col_1': [0, 1, 2, 3],
    'col_2': [4, 5, 6, 7],
    'col_3': [14, 15, 16, 'b']
})

df.astype(str).sum(1)

输出:

0    0414
1    1515
2    2616
3     37b
dtype: object

使用cumsum进行求和的一种替代方法,这样dtype将被保留,即:

s = df.astype(str).cumsum(1).iloc[:,-1]

输出结果:

0    0414
1    1515
2    2616
3    3719
Name: col_3, dtype: object

希望对您有所帮助。


它帮助我了解了一种新的cumsum方法,但为什么pandas数据框具有这种奇怪的行为... - BENY
这里返回的不是series,而是一个字符串,因此没有类型转换。也许当函数返回series时,它会尝试进行类型转换,如果没有类型转换错误,则返回转换后的series,否则返回原始的series。希望这可以解决你的疑惑。 - Bharath M Shetty
我正在阅读pandas的帮助文件,但是我找不到任何关于这个过程的提及。你有任何想法如何阻止这个奇怪的过程吗? - BENY
说实话,我一直在寻找保留dtype的方法。一旦成功找到,我肯定会更新解决方案。 - Bharath M Shetty
我就是不明白为什么他们在最后加上try except... - BENY
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接