大熊猫:如何将数据框的所有数字列转换为对数

时间:2019-01-27 14:09:00

标签: python pandas

在R中,我可以使用以下方法对数据框的所有数字列应用对数(或平方根等)转换:

logdf <- log10(df)

Python / Pandas中是否有等效的东西?我看到有一个“转换”和一个(类似R的)“应用”功能,但无法弄清楚在这种情况下如何使用它们。

感谢您的任何提示或建议。

4 个答案:

答案 0 :(得分:3)

如果大多数列都是数字,则仅try可能有意义,如果不起作用,则跳过该列:

for column in df.columns:
    try:
        df[column] = np.log10(df[column])
    except (ValueError, AttributeError):
        pass

当然,您可以将其包装在一个函数中。

答案 1 :(得分:2)

假设您有一个名为df的数据框

您可以先列出可能的数字类型,然后进行循环

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
for c in [c for c in df.columns if df[c].dtype in numerics]:
    df[c] = np.log10(df[c])

或者,使用lambda运算符和np.dtype.kind

的单线解决方案
numeric_df = df.apply(lambda x: np.log10(x) if np.issubdtype(x.dtype, np.number) else x)

答案 2 :(得分:2)

您可以使用select_dtypesnumpy.log10

import numpy as np
for c in df.select_dtype(include = [np.number]).columns:
    df[c] = np.log10(df[c])

select_dtypes选择传递到其include参数的数据类型的列。 np.number包括所有数字数据类型。

numpy.log10返回以元素为单位的输入的以10为底的对数

答案 3 :(得分:1)

如果您注重速度:

df = pd.DataFrame({'A': list('abc')*1000000, 'B': [10, 20,200]*1000000,
                  'C': [0.1,0.2,0.3]*1000000})
df.head()

%timeit df.apply(lambda x: np.log10(x) if np.issubdtype(x.dtype, np.number) else x)
#1 loop, best of 3: 539 ms per loop

%%timeit
log10_df = pd.concat([df.select_dtypes(exclude=np.number),
                      df.select_dtypes(include=np.number).apply(np.log10)],
                      axis=1)
#loop, best of 3: 315 ms per loop

%%timeit
for c in df.select_dtypes(include = [np.number]).columns:
    df[c] = np.log10(df[c].values)
#1 loop, best of 3: 113 ms per loop