将数据框的所有数字列转换为绝对值

时间:2016-03-28 23:13:04

标签: python pandas

我想将数据框中的所有数字列转换为它们的绝对值,并且这样做:

df = df.abs()

然而,它给出了错误:

*** TypeError: bad operand type for abs(): 'unicode'

如何解决这个问题?我真的不想手动指定列名

3 个答案:

答案 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的索引并不重要。一旦找出问题所在,我将更新此答案。 。对于微不足道的索引来说,这绝对可以正常工作