【发布时间】: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)。我错误地在这里对它们进行了说明,就好像它们的名字有共同点一样。列名实际上或多或少是随机的。