【问题标题】:Convert fractional values to decimal in Pandas在 Pandas 中将小数值转换为小数
【发布时间】:2021-11-05 18:23:02
【问题描述】:

我有一个包含杂乱数据的数据框。

df:
    1        2        3
--  -------  -------  -------
 0  123/100  221/100  103/50
 1  49/100   333/100  223/50
 2  153/100  81/50    229/100
 3  183/100  47/25    31/20
 4  2.23     3.2      3.04
 5  2.39     3.61     2.69

我希望将小数值转换为十进制,转换公式为

例如:

  • 123/100 = (123/100 + 1) = 2.23
  • 333/100 = (333/100 +1) = 4.33

计算为fractional value + 1

当然,保留十进制值。

如何在 Pandas 和 Python 中做到这一点?

【问题讨论】:

标签: python pandas dataframe operators


【解决方案1】:

一种简单的方法是首先定义一个转换函数,该函数将应用于列中的每个元素:

def convert(s):
    if '/' in s: # is a fraction
        num, den = s.split('/')
        return 1+(int(num)/int(den))
    else:
        return float(s)

然后使用.apply函数通过这个函数运行一列的所有元素:

df['1'] = df['1'].apply(convert)

结果:

df['1']:

0    2.23
1    1.49
2    2.53
3    2.83
4    2.23
5    2.39

然后根据需要在任何其他列上重复。

【讨论】:

  • 在整个数据帧上使用applymap ;)
  • df.applymap(lambda x: [1 + a/b for a, b in [[int(a) for a in x.split('/')]]][0] if "/" in x else float(x))
【解决方案2】:

如果您信任数据集中的数据,最简单的方法是使用@mozway 建议的eval 或更好的方法pd.eval

>>> df.replace(r'(\d+)/(\d+)', r'1+\1/\2', regex=True).applymap(pd.eval)
      1     2     3
0  2.23  3.21  3.06
1  1.49  4.33  5.46
2  2.53  2.62  3.29
3  2.83  2.88  2.55
4  2.23  3.20  3.04
5  2.39  3.61  2.69

【讨论】:

  • 使用pd.eval,很安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2023-03-11
  • 2016-09-16
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多