
[英]Pandas 1.1.0 groupby dropna=False argument unexpected behaviour with rolling window
[英]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
我偶然发现了这一点,因为我想避免由于性能问题而申请更大的数据帧(在我的情况下,使用agg
比apply
速度提高了 4 倍)。
真正想要做的是join
sc
和wc
的每个值,然后将这些组组合成一个字符串,例如:
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
仅在字符串列上运行。
连续的join
和agg
为我节省了大量的计算时间,但感觉不对。 欢迎任何见解!
我很确定这是一个与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
请注意,使用agg
和apply
与非 cythonized(或至少没有快速路径)的 function 之间几乎没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.