如何解决带有自定义聚合函数和 dtype 条件的 pandas agg:列无声地消失
我想对 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
欢迎任何有关为什么会发生这种情况以及如何处理的见解!
解决方法
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。