繁体   English   中英

Pandas:groupby 后跟聚合 - 加入字符串时出现意外行为

[英]Pandas: groupby followed by aggregate - unexpected behaviour when joining strings

有一个包含两列str类型的pandas数据框:

    group   sc  wc
0   1       A   word1
1   2       B   word2
2   2       C   word3
3   1       D   word4

创建如下:

df = pd.DataFrame({"group":[1,2,2,1],"sc":["A","B","C","D"],"wc":["word1", "word2", "word3","word4"]})

group分组并加入各个列时,我可以使用:

df.groupby("group",as_index=False).agg(lambda x: '|'.join(x))

    group   sc  wc
0   1   A|D word1|word4
1   2   B|C word2|word3

但是,当指定单个列 ( wc ) 来执行此操作时:

df.groupby("group",as_index=False)["wc"].agg(lambda x: '|'.join(x))

    group   wc
0   1   group|sc|wc
1   2   group|sc|wc

这似乎是列名的join 但是为什么会这样处理呢?

正确的实现将使用apply

df.groupby("group",as_index=False)["wc"].apply(lambda x: '|'.join(x))

    group   wc
0   1   word1|word4
1   2   word2|word3

我偶然发现了这一点,因为我想避免由于性能问题而申请更大的数据帧(在我的情况下,使用aggapply速度提高了 4 倍)。

真正想要做的是join scwc的每个值,然后将这些组组合成一个字符串,例如:

df["merged"] = df.sc + "|" + df.wc
df.groupby("group",as_index=False).agg('|'.join))

    group   sc  wc  merged
0   1   A|D word1|word4 A|word1|D|word4
1   2   B|C word2|word3 B|word2|C|word3

一旦使用整数,它还有更多:

df = pd.DataFrame({"group":[1,2,2,1],"sc":[3,33,333,3333],"wc":[1,10,100,1000]})
df["merged"] = df.sc.astype(str) + "|" + df.wc.astype(str)
df.groupby(["group"],as_index=False).agg('|'.join)

    group   merged
0   1   3|1|3333|1000
1   2   33|10|333|100

这表明join仅在字符串列上运行。

连续的joinagg为我节省了大量的计算时间,但感觉不对。 欢迎任何见解!

我很确定这是一个与GroupBy.agg相关的错误,由于as_index=False而出现 - 整个子组 DataFrame 被传递给agg 删除它,output 就像预期的那样。

df.groupby("group")["wc"].agg('|'.join).reset_index()
 
   group           wc
0      1  word1|word4
1      2  word2|word3

当子组与其列一起传递时,调用str.join将加入列名,如下所示

'|'.join(df)
# 'group|sc|wc'  # this joins on the column names because iteration 
                 # on dataFrames devolves to iteration over headers

请注意,使用aggapply与非 cythonized(或至少没有快速路径)的 function 之间几乎没有区别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM