gpt4 book ai didi

python - 将函数应用于 Pandas DataFrame 的列,以数据类型为条件

转载 作者:太空狗 更新时间:2023-10-29 20:20:58 27 4
gpt4 key购买 nike

我想使用通用模式将一个函数应用于 Pandas DataFrame 中的每一列,但该函数应该以列数据类型为条件。

听起来很简单。但是我在测试数据类型时发现了一个奇怪的行为,我无法在文档中找到任何地方或谷歌搜索它的原因。

考虑这个 repex:

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')

但是如果我使用 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')]

最佳答案

comment是正确的。此行为是设计使然。 Pandas 为所有给定的数据类型“应用”类型层次结构中最高的类型。

考虑仅将函数应用于“A”,

df[['A']].apply(dtype_fn)
int64

A int64
dtype: object

同样,只有“A”和“B”,

df[['A', 'B']].apply(dtype_fn)
float64
float64

A float64
B float64
dtype: object

由于您有多种类型,包括原始 DataFrame 中的字符串,因此它们的通用类型都是 object


现在这解释了行为,但我仍然需要解决问题。 Pandas 提供了一个有用的方法:Series.infer_objects它推断数据类型并执行“软转换”。

如果您确实需要函数中的类型,可以在调用dtype 之前执行软转换。这会产生预期的结果:

def dtype_fn(the_col):
the_col = the_col.infer_objects()
print(the_col.dtype)

return(the_col.dtype)

df.apply(dtype_fn)
int64
float64
object
bool

A int64
B float64
C object
D bool
dtype: object

关于python - 将函数应用于 Pandas DataFrame 的列,以数据类型为条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55180132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com