gpt4 book ai didi

python - Pandas:将了解列类型的函数应用于数据框的每一列

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:57 25 4
gpt4 key购买 nike

目标

我想将取决于输入列类型的函数应用于数据框中的每一列。考虑以下数据框:

df = pd.DataFrame( [["a",1],["b",2]], columns = ["string","num"] )

我可以测试列的类型:

>>> df["num"].dtype            
dtype('int64')
>>> df["num"].dtype in ["int64"]
True

我可以对所有列应用一个函数:

>>> df . apply( lambda column: column.sum() )
string ab
num 3
dtype: object

但是如果我使函数依赖于列的类型,我会得到垃圾:

>>> df . apply( lambda column:
... np.nan if not column.dtype in ['float64','float32','int32','int64']
... else column.sum() )
string NaN
num NaN
dtype: float64

动机

有些解决方案涉及基本上删除非数字列,但实际上我需要保留它们。这样做的原因是我试图将计算每列中零的行附加到 df.describe 的结果。下面是一个类似函数的示例:

def describe_plus(df):
most_stats = df.describe()
missing_stat = pd.DataFrame( df.isnull().sum()
, columns = ["missing"]
).transpose()
length_stat = pd.DataFrame( [[len(df) for _ in df.columns]]
, index = ["length"]
, columns = df.columns )
return length_stat.append( missing_stat.append( most_stats ) )

调用它可以得到 pd.describe 的普通输出,加上每列中缺少的长度和数字:

>>> describe_plus( df )
num string
length 2.000000 2.0
missing 0.000000 0.0
count 2.000000 NaN
mean 1.000000 NaN
std 1.414214 NaN
min 0.000000 NaN
25% 0.500000 NaN
50% 1.000000 NaN
75% 1.500000 NaN
max 2.000000 NaN

除了 length 和 missing 之外,我想在 describe_plus 中添加第三行,它计算每列中零的数量,或者为非数字的列提供 NaN。

编辑:RafaelC 的解决方案,在此框架中

诀窍是丢弃那些非数字变量,计算汇总统计数据,然后简单地附加其他统计数据(在每一列上定义,甚至是非数字的)。

def describe_plus_plus(df):
nums = df.select_dtypes(include=[np.number])
zeroes = pd.DataFrame( [nums.apply( lambda col: len( col[col==0] ) /
len(nums) )] )
return zeroes.append( describe_plus( df ) )

它的实际例子:

>>> df = pd.DataFrame( [[0,0,0,""],[0,0,1,"a"],[0,1,2,"b"]], columns = ["none","1/3","2/3","string"] )
>>> describe_plus_plus( df )
1/3 2/3 none string
0 0.666667 0.333333 1.0 NaN
length 3.000000 3.000000 3.0 3.0
missing 0.000000 0.000000 0.0 0.0
count 3.000000 3.000000 3.0 NaN
mean 0.333333 1.000000 0.0 NaN
std 0.577350 1.000000 0.0 NaN
min 0.000000 0.000000 0.0 NaN
25% 0.000000 0.500000 0.0 NaN
50% 0.000000 1.000000 0.0 NaN
75% 0.500000 1.500000 0.0 NaN
max 1.000000 2.000000 0.0 NaN

最佳答案

如果您有允许的类型列表,只需使用 loc

allowed_types = [np.float64, np.float32,np.int32, np.int64]
mask = df.dtypes.isin(allowed_types)
df.loc[:, mask].sum()

然而,一个可能更好的方法是使用 select_dtypes ,如果您只想选择数字列,则使用 np.number 作为父数据类型。

df.select_dtypes(include=[np.number])

当然,如果您确实需要具体说明,可以将 [np.number] 更改为您的 allowed_types 列表。

关于python - Pandas:将了解列类型的函数应用于数据框的每一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52451520/

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