将基于一列中的值的数据集与另一列中的值进行分组

时间:2017-11-29 16:59:19

标签: python

col 1    col 2
---------------
orange     a
banana     a 
grape      b
grape      a
orange     b
apple      b
orange     b
banana     a

我有两列,我想根据col 1col 2的值对它们进行分组。我希望输出为:

   grape  orange  apple  banana
---------------------------------
a    1      1       0      2
b    1      2       1      0

任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:1)

pandas我可以这样做:

首先,我使用字符串中的数据创建DataFrame,但您可以从文件(pd.read_csv等)中读取数据。

import pandas as pd

data = '''orange     a
banana     a 
grape      b
grape      a
orange     b
apple      b
orange     b
banana     a'''

rows = [row.split() for row in data.split('\n')]

print(rows)

df1 = pd.DataFrame(rows, columns=['col 1', 'col 2'])

print(df1)

结果

[['orange', 'a'], ['banana', 'a'], ['grape', 'b'], ['grape', 'a'],
 ['orange', 'b'], ['apple', 'b'], ['orange', 'b'], ['banana', 'a']]

    col 1 col 2
0  orange     a
1  banana     a
2   grape     b
3   grape     a
4  orange     b
5   apple     b
6  orange     b
7  banana     a

现在我可以将元素分组来计算它们

df2 = df.groupby(['col 1', 'col 2']).size().reset_index(name='counts')

print(df2)

结果

    col 1 col 2  counts
0   apple     b       1
1  banana     a       2
2   grape     a       1
3   grape     b       1
4  orange     a       1
5  orange     b       2

然后我可以使用pivot来获得预期的结果。

df3 = df2.pivot(index='col 2', columns='col 1', values='counts')

print(df3)

结果

col 1  apple  banana  grape  orange
col 2                              
a        NaN     2.0    1.0     1.0
b        1.0     NaN    1.0     2.0

有空位(NaN)所以我用0

填充它
df4 = df3.fillnan(0)

print(df4)

结果:

col 1  apple  banana  grape  orange
col 2                              
a        0.0     2.0    1.0     1.0
b        1.0     0.0    1.0     2.0