将函数应用于Pandas数据帧的列,条件是数据类型

2024-04-19 17:45:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

考虑这种排斥:

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。在

^{pr2}$

为什么会这样?,我做错了什么?,为什么列不保留原始数据类型?在

这里有一个有效的方法,它产生了我想要的输出:(但是由于封装的原因,我不喜欢它)

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

Tags: 函数nametruepandas模式原因colpd
3条回答

您希望在数据帧上使用apply-fn,但是您忘记了基本类型转换(在大多数OOP语言中都是一个问题)。快速解决方法如下:

def selectiveapply(row):
    return(type(row[0]))
toydf=toydf.T
toydf["type"]=toydf.apply(selectiveapply,axis=1)

通过设置轴=0,也可以按列应用apply。玩玩一下函数,你最终会找到答案的。在

这个comment是正确的。这种行为是故意的。Pandas为所有给定的数据类型“应用”类型层次结构中最高的类型。在

考虑只将函数应用于“A”

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

A    int64
dtype: object

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

^{pr2}$

由于您有多种类型,包括原始数据帧中的string,因此它们的通用类型都是object。在


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

如果确实需要函数中的类型,可以在调用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

您的dtype_fn的实际输入是Pandas系列对象。您可以通过稍微修改方法来访问基础类型。在

def dtype_fn(the_col):
    print(the_col.values.dtype)
    return(the_col.values.dtype)

有关为什么会出现这种情况的更多信息,您可以看看这个answer。上面写着

This is not an error but is due to the numpy dtype representation: https://docs.scipy.org/doc/numpy/reference/arrays.scalars.html.

相关问题 更多 >