在R中,我可以使用以下方法对数据框的所有数字列应用对数(或平方根等)转换:
logdf <- log10(df)
Python / Pandas中是否有等效的东西?我看到有一个“转换”和一个(类似R的)“应用”功能,但无法弄清楚在这种情况下如何使用它们。
感谢您的任何提示或建议。
答案 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_dtypes和numpy.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