Pandas:如何将带有 integer/fraction 的数列转换为整数

Pandas: How to convert series with an integer/fraction mix into a whole number

所以我遍历包含数字的 Excel 列,我试图使用 .apply(pd.to_numeric).round()

对所有数字进行舍入

这对我一直有效,但最近,一些 Excel 文件包含数字与分数混合的列(例如 27 3/8、50 17/32)。当我的脚本运行时,我得到“无法解析位置 0 处的字符串“50 17/32””

假设这是我的系列:

0           250.25
1           32.75
2           64
3           50 17/32
4           16 3/8
Name: Qty, dtype: object

想要的结果:

0           250
1           33
2           64
3           51
4           16
Name: Qty, dtype: object

我试图根据白色 space 拆分列,并试图以某种方式将 2 列加在一起,但我 运行 遇到了各种各样的问题。下面的代码有点工作,但我原来的 'Qty' 列返回一堆 NaN,而不是没有分隔符

的行的原始数字
df['Qty'] = df['Qty'].fillna(value=np.nan)
df[['Qty','Fraction']] = df['Qty'].str.split(' ', expand=True)

这是我原来的 ['Qty'] 专栏:

这里是 运行 之后拆分代码的相同行:

有趣的是,它确实使用整数分数混合正确地拆分了行,但是由于我不明白的原因将某些行转换为 NaN 让我失望了。我尝试过的另一件事是使用 lambda 函数,但据我所知,当它只是一个传统分数(如 3/8)且前面没有整数时,这些函数效果最好。研究了几个小时,我快要放弃了,所以如果有人知道如何解决这个问题,我很想知道

谢谢

这是一种使用 fractions.Fraction 的方法:

from fractions import Fraction
df2 = df['Qty'].str.extract(r'(\d+(?:\.\d+)?)?\s*(\d+/\d+)?')

out = (pd.to_numeric(df2[0], errors='coerce')
      +df2[1].fillna(0).apply(lambda x: float(Fraction(x)))
      )
df['float'] = out
df['int'] = out.round().astype(int)

输出:

        Qty      float  int
0    250.25  250.25000  250
1     32.75   32.75000   33
2        64   64.00000   64
3  50 17/32   50.53125   51
4    16 3/8   16.37500   16

使用算术的替代方法:

df2 = df['Qty'].str.extract(r'(\d+(?:\.\d+)?)?\s*(?:(\d+)/(\d+))?').astype(float)
df['int'] = (df2[0]+df2[1].fillna(0)/df2[2].fillna(1)).round().astype(int)