【问题标题】:Turn str fractions to floats in pandas df将 str 分数转换为 pandas df 中的浮点数
【发布时间】:2019-03-21 19:48:05
【问题描述】:

我有一个非常尴尬的 pandas DataFrame,看起来像这样:

identifier    per_1       per_2       per_3       per_4       per_5
'something'   124/127     100/100     24/39       14/20       10/10
'camel'       121/122     150/206     300/307     11/12       0/2
 ...          ...         ...         ...         ...         ...

所以,除了第一列之外的所有内容都是一个“分数”,实际上是一个字符串。我更喜欢十进制形式。要访问除第一列之外的所有内容,我抓取:

df.loc[:,df.columns != ('identifier')]

效果很好。如果我想将一列变成小数,我可以这样做:

df['per_1'] = df['per_1'].apply(lambda x: [float(n) for n in x.split('/')[0:2]])
df['per_1'] = df['per_1'].apply(lambda x: x[0] / x[1] if x[1] != 0 else np.nan)

然后,我必须遍历我想要为其执行此操作的每一列。考虑到我实际上可以抓取我想要使用df.loc[:,df.columns != ('identifier')] 执行此操作的每一列,这对我来说并不像pythonic。有没有更好的方法来解决这个问题?

【问题讨论】:

  • 您可以使用df.filter(like='per')pd.DataFrame.filter
  • 我需要澄清一下; ID 实际上不是('per_1', 'per_2', 'per_3', etc)。我错误地在这里对它们进行了说明,就好像它们的名字有共同点一样。列名实际上或多或少是随机的。

标签: python pandas


【解决方案1】:

试试下面的代码:

df[['identifier']].join(df.filter(like='per').apply(pd.eval))

    identifier     per_1     per_2     per_3     per_4 per_5
0  'something'  0.976378         1  0.615385       0.7     1
1      'camel'  0.991803  0.728155  0.977199  0.916667     0

【讨论】:

  • 也许只是df.apply(pd.eval)? (虽然不确定第一列中的引号)
  • 嗯,奇怪..无法重现。 df.apply(pd.eval) 在这里工作正常!
  • @RafaelC 我认为引号是罪魁祸首
  • @JohnRouhana 你的代码对我有用。可能是this会帮助你
  • 所以这行得通,但显然 Pandas 有一个错误;它最多只能工作 100 行。我可以很容易地打破我所拥有的。接受答案。
猜你喜欢
  • 2017-12-21
  • 2021-05-25
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
相关资源
最近更新 更多