【问题标题】:pandas agg with custom aggregation function and dtype condition: column disappears silently具有自定义聚合函数和 dtype 条件的 pandas agg:列静默消失
【发布时间】:2021-06-29 12:32:49
【问题描述】:

我想对 pandas 数据框进行分组和聚合。 我有一个自定义聚合函数,它应该根据它所应用的系列的 dtype 来做不同的事情。 但是,某些列会无声无息地消失。它似乎与 dtype 条件有关。

在制作可重现示例的过程中,我注意到了一些奇怪的事情:

  • 如果我先测试该系列是否为 dtype string,然后对其他情况使用 else 语句,我的数字列将被静默删除
  • 但是,如果我先测试 series.dtype == "int64",它会按预期工作。

这是我的可复制示例:

import pandas as pd

# reprex dataframe
groups = ["group1", "group1", "group2", "group2"]
numbers = [1, 2, 3, 4]
letters = ["a", "b", "c", "c"]
data = {"group": groups, "number": numbers, "letter": letters}
df = pd.DataFrame(data)
df["letter"] = df["letter"].astype("string")

# custom aggregation functions
def is_int(series):
    if series.dtype == "int64":
        return "int64"
    else:
        return "not an int"

def is_string(series):
    if series.dtype == "string":
        return "string"
    else:
        return "not a string"

# the confusing part
df.groupby("group").agg(is_int) # works as expected
df.groupby("group").agg(is_string) # the "number" column disappears silently

欢迎任何关于为什么会发生这种情况以及如何处理它的见解!

【问题讨论】:

    标签: pandas dataframe pandas-groupby aggregate dtype


    【解决方案1】:

    new Dtypes 是实验性的,因此总是有奇怪的怪癖。问题是,虽然将字符串 dtype 与 'string' 进行比较是有意义的,但它对于任何其他 dtype 都失败了。

    df['letter'].dtype == 'string'
    # True
    
    df['number'].dtype == 'string'
    #TypeError: data type 'string' not understood
    

    因此 groupby 在您的第二种情况下默默地忽略错误并且不显示输出,因为它无法聚合该列。正确的比较是与实际的字符串Dtype:pd.StringDtype,并使用isinstance

    def is_string(series):
        if isinstance(series.dtype, pd.StringDtype):
            return "string"
        else:
            return "not a string"
    
    df.groupby("group").agg(is_string)
    #              number  letter
    #group                       
    #group1  not a string  string
    #group2  not a string  string
    

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 2020-02-02
      • 2020-10-05
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多