Pandas Groupby:** **包含一个包含元组的列

时间:2015-03-13 05:50:02

标签: python pandas

我正在尝试将分组一个包含元组的列。每个元组都有不同的长度。

我想在这个元组列上执行简单的groupby操作,例如sum或count。

示例:

df = pd.DataFrame(data={
                    'col1': [1,2,3,4]  ,
                    'col2': [('a', 'b'), ('a'), ('b', 'n', 'k'), ('a', 'c', 'k', 'z') ] ,
                    })

print df

输出:

   col1          col2
0     1        (a, b)
1     2        (a, m)
2     3     (b, n, k)
3     4  (a, c, k, z)

我希望能够将 col2 归类于 col1,例如总和。

预期输出为:

   col2        sum_col1
0     a        7
1     b        4
2     c        4
3     n        3
3     m        2
3     k        7
3     z        4

我觉得pd.melt可能会使用,但我看不清楚如何。

1 个答案:

答案 0 :(得分:2)

以下是使用.get_dummies.melt的方法:

import pandas as pd
df = pd.DataFrame(data={
                    'col1': [1,2,3,4]  ,
                    'col2': [('a', 'b'), ('a'), ('b', 'n', 'k'), ('a', 'c', 'k', 'z') ] ,
                    })

value_col = 'col1'
id_col = 'col2'

将元组解压缩到DataFrame:

df = df.join(df.col2.apply(lambda x: pd.Series(x)))

创建值为元组的列:

dummy_cols = df.columns.difference(df[[value_col, id_col]].columns)
dfd = pd.get_dummies(df[dummy_cols | pd.Index([value_col])])

产:

   col1  0_a  0_b  1_b  1_c  1_n  2_k  3_z
0     1    1    0    1    0    0    0    0
1     2    1    0    0    0    0    0    0
2     3    0    1    0    0    1    1    0
3     4    1    0    0    1    0    1    1

然后.melt它并清除前缀中的variable列:

dfd = pd.melt(dfd, value_vars=dfd.columns.difference([value_col]).tolist(), id_vars=value_col)
dfd['variable'] = dfd.variable.str.replace(r'\d_', '')
print dfd.head()

产量:

   col1 variable  value
0     1        a      1
1     2        a      1
2     3        a      0
3     4        a      1
4     1        b      0

最后得到你的输出:

dfd[dfd.value != 0].groupby('variable')[value_col].sum()

    variable
a           7
b           4
c           4
k           7
n           3
z           4
Name: col1, dtype: int64