【问题标题】:How to find number of decimal places in a number also counting trailing zero in python如何在python中查找数字中的小数位数也计算尾随零
【发布时间】:2020-03-02 17:00:36
【问题描述】:

我的问题是关于使用 python 或 pandas 计算小数点后的位数。到目前为止回答的问题首先将浮点数转换为字符串,然后计算小数点后的字符数。在将十进制转换为 str() 时,尾随零会丢失。但就我而言,我需要计算小数点后的总位数,包括尾随零(如果存在)。也就是说,对于数字 7.80,答案应该是小数点后两位而不是一位,当然,对于 7.8,答案应该是小数点后一位。请让我知道这是否可行。

其实我的问题是这样的: 假设我有一个熊猫系列如下:

0.123
0.124
0.123
0.349
0.349
0.340

我想生成两个特征。现有数据的一个简单 value_counts()。 所以答案是:

0.123   2
0.124   1
0.123   2
0.349   2
0.349   2
0.340   1

在删除最后一个数字后,另一个特征生成将是 value_counts()。新功能将是:

0.123   3
0.124   3
0.123   3
0.349   3
0.349   3
0.340   3

谢谢你的麻烦

【问题讨论】:

  • 您输入的数据类型是什么?如果它是浮动的,那么后面的 0 已经丢失了! float(7.80) 输出“7.8”
  • 只有数字列的 Pandas 数据框
  • 请添加你的数据框和df.column.describe()的输出
  • 使用decimal 而不是float 将在转换为字符串时保留尾随零。
  • 在熊猫系列中,astype('decimal') 不起作用

标签: python pandas


【解决方案1】:

使用浮点数并不总是那么容易,因为precision。

这里可能的解决方案是100 的多个值并转换为整数,然后可能使用GroupBy.transform 获取新系列的大小:

df['a'] = df['col'].map(df['col'].value_counts())
#alternative
#df['a'] = df.groupby('col')['col'].transform('size')

N = 2
s = df['col'].mul(10 ** N).astype(np.int64)
df['b'] = s.groupby(s).transform('size')
print (df)
     col  a  b
0  0.123  2  3
1  0.124  1  3
2  0.123  2  3
3  0.349  2  3
4  0.349  2  3
5  0.340  1  3

就像提到的@Fourier,如果可能的话,你可以使用(使用真实数据的最佳测试,有时可能会因为浮点精度而失败):

N = 2
df['b'] = df['col'].round(N).groupby(df['col']).transform('size')

【讨论】:

  • 感谢您的回复。实际上,我想为数据帧的所有列创建一个通用函数,其中小数点后的小数位数可能会有所不同。在某些列中可能有两个,在某些列中可能有 5 个,依此类推。在您的解决方案中,我将不得不手动为 N 提供值。是否可以自动推断。
  • 找不到df.groupby(df['col'].apply(lambda x: round(x, 2))).transform("size")的方法吗?
  • 这就是我最初提出问题的原因。只需删除最后一位并执行 value_counts()。
  • @user3282777 - 嗯,如果字符串表示浮点数,那么可能,但如果浮点数,那么实际数据有问题 - 0.1230000005441144 删除最后一个 4 :(
  • 我的数据都是数字列。已经推荐了这种用于数值数据的特征生成技术。参考幻灯片 30 here.
猜你喜欢
  • 2014-01-11
  • 2019-10-12
  • 2018-11-06
  • 2021-12-09
  • 2022-12-03
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
相关资源
最近更新 更多