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

标签 python pandas lambda types

目标

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

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/

相关文章:

python - Pydantic - 在response_model中使用 "Union"和 "Field"时无法序列化/验证

python - 如何在运行 Enthought Canopy 的 Linux 机器上设置 mapnik 的 python 绑定(bind)

python-3.x - 在有条件的情况下除以 pandas 中的前一行

Ruby:lambda 函数参数可以有默认值吗?

C++ Lambda/Closure 混淆——如何返回一个值,而不是一个闭包

python - Jupyter 错误环境显示在 Conda 选项卡中,扩展名为 `nb_conda`

python - 如何列出所有类属性

python-3.x - 根据存储在向量中的列名称对 pandas 数据框进行子集化

python - 无法使用for循环处理大量数据

java - 编写 Java 7 库代码以与 Java 8 lambda 配合使用