【发布时间】:2019-01-27 12:57:02
【问题描述】:
鉴于以下 DataFrame,我尝试聚合列 'A' 和 'C'。对于'A',计算字符串的唯一出现次数,对于'C',求和。
当'A' 中的一些样本实际上是这些字符串的列表时,就会出现问题。
这是一个简化的例子:
df = pd.DataFrame({'ID': [1, 1, 1, 1, 1, 2, 2, 2],
'A' : ['a', 'a', 'a', 'b', ['b', 'c', 'd'], 'a', 'a', ['a', 'b', 'c']],
'C' : [1, 2, 15, 5, 13, 6, 7, 1]})
df
Out[100]:
ID A C
0 1 a 1
1 1 a 2
2 1 a 15
3 1 b 5
4 1 [b, c, d] 13
5 2 a 6
6 2 a 7
7 2 [a, b, c] 1
aggs = {'A' : lambda x: x.nunique(dropna=True),
'C' : 'sum'}
# This will result an error: TypeError: unhashable type: 'list'
agg_df = df.groupby('ID').agg(aggs)
我想要以下输出:
print(agg_df)
A C
ID
1 4 36
2 3 14
这是因为对于 'ID' = 1,我们有 'a', 'b', 'c' and 'd',对于 'ID' = 2,我们有 'a', 'b', 'c'。
【问题讨论】:
-
lambda x: x.apply(pd.Series).stack().nunique()会这样做吗? -
@JonClements 是的!把它作为答案,这样我就可以吻你了,如果你在这个 lambda 中解释细节,我将非常感激
-
apply(pd.Series)+stack会起作用,但也可能会很慢。 -
@jpp 确实......这就是为什么我没有发布答案......这些天必须有一种更好的熊猫风格的方法... :)
-
@JonClements,是的,它这样是一个常见问题。我最喜欢(对于少数列)是
np.repeat+it.chain,但我觉得我们重复的食谱应该内置在 Pandas 中,可能是 Cythonised 用于一般用途。
标签: python pandas dataframe pandas-groupby