Pandas将浮点数转换为没有小数的字符串

43

我有一个数据框

df = pd.DataFrame([
        ['2', '3', 'nan'],
        ['0', '1', '4'],
        ['5', 'nan', '7']
    ])

print df

   0    1    2
0  2    3  nan
1  0    1    4
2  5  nan    7

我想将这些字符串转换为数字并对列求和,然后再转换回字符串。

使用astype(float)似乎可以将字符串转换为数字。然后使用sum()很容易实现求和。最后使用astype(str)也应该很容易将结果转换回字符串。

df.astype(float).sum().astype(str)

0     7.0
1     4.0
2    11.0
dtype: object

这几乎是我想要的。我需要整数的字符串版本。但浮点数有小数位。如何去掉它们?

我想要这个。

0     7
1     4
2    11
dtype: object
7个回答

35

对于 pandas 版本 >= 1.0:

'Int64' 引入了 '<NA>' 类型。现在你可以这样做:

df['your_column'].astype('Int64').astype('str')

它将正确地将 1.0 转换为 1


替代方案:

如果您不想改变所有 Pandas 的显示选项,可以使用 @maxymoo 的解决方案所述的方法,您可以使用 apply

df['your_column'].apply(lambda x: f'{x:.0f}')

太好了!astype('Int64').astype('str') 可以用于转换单个列。由于这是真正的数据类型重格式化,我更喜欢这种方法而不是更改显示选项。 - Culdesac

32

如果您的列包含空值,则将其转换为 int(即使用 .astype(int).astype(str))将无效;更好的做法是使用字符串格式化来明确指定您的字符串列的格式;(您可以在 pd.options 中设置此选项):

>>> pd.options.display.float_format = '{:,.0f}'.format
>>> df.astype(float).sum()
0     7
1     4
2    11
dtype: float64

谢谢,这就是我想要的答案! - IanS
我认为DataFrame的正确方法是applymap,而不是map - IanS
1
@IanS 是的,你说得对,我使用了 map,因为在进行格式化之前我先对列求和了。 - maxymoo
为什么在这里.format()会转换为对象?它是隐式地从浮点数转换为字符串吗? - ℕʘʘḆḽḘ
@ℕʘʘḆḽḘ 我猜格式是在转换中使用的。也许在文档中提到的系列格式化程序中。 - Felix

25

在混合中添加astype(int)

df.astype(float).sum().astype(int).astype(str)

0     7
1     4
2    11
dtype: object

演示带有空单元格的示例。这不是原始问题的要求,但是为了满足反对者的要求。
df = pd.DataFrame([
        ['2', '3', 'nan', None],
        [None, None, None, None],
        ['0', '1', '4', None],
        ['5', 'nan', '7', None]
    ])

df

      0     1     2     3
0     2     3   nan  None
1  None  None  None  None
2     0     1     4  None
3     5   nan     7  None

然后

df.astype(float).sum().astype(int).astype(str)

0     7
1     4
2    11
3     0
dtype: object

因为发帖人没有明确说明当某一列全都缺失时应该发生什么,显示零是一个合理的选择。

然而,我们也可以删除这些列。

df.dropna(1, 'all').astype(float).sum().astype(int).astype(str)

0     7
1     4
2    11
dtype: object

我相信你刚才成为了一些策略性贬低的受害者。+1 是为了抵消这种情况,同时因为你的回答比其他人早。 - mechanical_meat
这个无法处理所有值都缺失的行。 - dlm
@dlm 没错,它确实有效。我刚刚运行了一个示例。如果你有具体情况,请提出问题以解决疑惑。这个回答满足了原帖的要求。如果你觉得没用,不一定非要点赞。但是给一个负评意味着这个回答没有使用价值,而事实上它解决了所提出的问题。 - piRSquared
错误的解决方案,使用 sum 会改变最终结果。 - Rocketq

3
在转换为字符串之前添加astype(int)
print (df.astype(float).sum().astype(int).astype(str))

生成所需结果。

3
上面的方法对我没有用,所以我将添加我的解决方案。
将数字转换为字符串并去掉“.0”:
db['a] = db['a'].astype(str).str.rstrip('.0')

如果输入以0结尾,则也会删除0。例如:输入1230.0,预期输出为1230,实际输出为123。 - Filipe Gomes

1

0

上述解决方案,在转换为字符串时,也会将NaN转换为字符串。要避免这种情况并保留NaN,请使用:

c = ...  # your column
np.where(
    df[c].isnull(), np.nan,
    df[c].apply('{:.0f}'.format)
)

保留NaN可以让您执行此类操作,例如将可空整数列(如19991231、20000101、np.nan、20000102)转换为日期时间,而不触发日期解析错误。


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