我想将数据框中的所有数字列转换为它们的绝对值,并且这样做:
df = df.abs()
然而,它给出了错误:
*** TypeError: bad operand type for abs(): 'unicode'
如何解决这个问题?我真的不想手动指定列名
答案 0 :(得分:3)
借用this question的答案,如何选择数字列?
假设您从
开始df = pd.DataFrame({'a': ['-1', '2'], 'b': [-1, 2]})
>>> df
a b
0 -1 -1
1 2 2
然后就这样做
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
for c in [c for c in df.columns if df[c].dtype in numerics]:
df[c] = df[c].abs()
>>> df
a b
0 -1 1
1 2 2
答案 1 :(得分:3)
您可以使用np.issubdtype
检查列的dtype是np.number
还是apply
。使用@Amy Tavory示例:
df = pd.DataFrame({'a': ['-1', '2'], 'b': [-1, 2]})
res = df.apply(lambda x: x.abs() if np.issubdtype(x.dtype, np.number) else x)
In [14]: res
Out[14]:
a b
0 -1 1
1 2 2
或者您可以使用np.dtype.kind
检查您的dtype是否为数字:
res1 = df.apply(lambda x: x.abs() if x.dtype.kind in 'iufc' else x)
In [20]: res1
Out[20]:
a b
0 -1 1
1 2 2
注意:您可能也对NumPy dtype hierarchy
感兴趣答案 2 :(得分:0)
比现有答案更快,更要点:
df.update(df.select_dtypes(include=[np.number]).abs())
(小心:我注意到update
有时没有任何作用时,df
的索引并不重要。一旦找出问题所在,我将更新此答案。 。对于微不足道的索引来说,这绝对可以正常工作