【发布时间】:2019-08-06 09:18:01
【问题描述】:
我想使用通用模式将函数应用于 Pandas DataFrame 中的每一列,但该函数应根据列数据类型工作。
听起来很简单。但是我在测试数据类型时发现了一个奇怪的行为,我在文档中的任何地方都找不到或在谷歌上搜索它的原因。
考虑这个重复:
import pandas as pd
toydf = pd.DataFrame(dict(
A = [1, 2, 3],
B = [1.1, 1.2, 1.3],
C = ['1', '2', '3'],
D = [True, True, False]
))
单独检查它们是dtype('int64'), dtype('float64'), dtype('O'), dtype('bool')的dtypes
但如果我使用apply 函数,则传递给该函数的所有列都是dtype: object。
def dtype_fn(the_col):
print(the_col)
return(the_col.dtype)
toydf.apply(dtype_fn)
toydf.apply(dtype_fn)
0 1
1 2
2 3
Name: A, dtype: object
0 1.1
1 1.2
2 1.3
Name: B, dtype: object
0 1
1 2
2 3
Name: C, dtype: object
0 True
1 True
2 False
Name: D, dtype: object
Out[167]:
A object
B object
C object
D object
dtype: object
这是为什么?,我做错了什么?,为什么列不保留原始数据类型?
这是一种可行并产生我想要的输出的方法:(但出于封装原因,我不喜欢它)
def dtype_fn2(col_name):
return(toydf[col_name].dtype)
[dtype_fn2(col) for col in toydf.columns]
Out[173]: [dtype('int64'), dtype('float64'), dtype('O'), dtype('bool')]
【问题讨论】:
-
在阅读更多内容后,当您对这些列执行应用时,由于此处存在多个不同类型的列,pandas 将在这些列中选择“公分母”。在您的示例中,如果您删除“字符串”和“布尔”列,您将停止将“对象”作为您的类型并获得 float64。话虽如此,我不知道如何解决这个问题,但由于这次冒险,我今天学到了一些新东西:)