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)
所以我遍历包含数字的 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)