从2列创建一个表

时间:2016-09-21 13:00:26

标签: python pandas group-by aggregate multiple-columns

我对Python很新。

我在数据框上有2列,列类似于:

db = pd.read_excel(path_to_file/file.xlsx)
db = db.loc[:,['col1','col2']]

col1  col2
C     4
C     5
A     1
B     6
B     1
A     2
C     4

我需要它们是这样的:

   1 2 3 4 5 6
A  1 1 0 0 0 0
B  1 0 0 0 0 1
C  0 0 0 2 1 0

因此它们就像行和列一样,值指的是巧合数。

2 个答案:

答案 0 :(得分:2)

假设您的列名为catval

In [26]: df = pd.DataFrame({'cat': ['C', 'C', 'A', 'B', 'B', 'A', 'C'], 'val': [4, 5, 1, 6, 1, 2, 4]})

In [27]: df
Out[27]: 
  cat  val
0   C    4
1   C    5
2   A    1
3   B    6
4   B    1
5   A    2
6   C    4

然后你可以groupby表格层次结构,然后将其取消堆叠:

In [28]: df.val.groupby([df.cat, df.val]).sum().unstack().fillna(0).astype(int)
Out[28]: 
val  1  2  4  5  6
cat               
A    1  2  0  0  0
B    1  0  0  0  6
C    0  0  8  5  0

修改

正如IanS所指出的,这里缺少3个(谢谢!)。如果您必须拥有一系列列,则可以使用

r = df.val.groupby([df.cat, df.val]).sum().unstack().fillna(0).astype(int)

for c in set(range(1, 7)) - set(df.val.unique()):
    r[c] = 0

答案 1 :(得分:1)

我认为您需要按size进行聚合并通过reindex向列添加缺失值:

print (df)
   a  b
0  C  4
1  C  5
2  A  1
3  B  6
4  B  1
5  A  2
6  C  4

df1 = df.b.groupby([df.a, df.b])
          .size()
          .unstack()
          .reindex(columns=(range(1,df.b.max() + 1)))
          .fillna(0)
          .astype(int)

df1.index.name = None
df1.columns.name = None
print (df1)
   1  2  3  4  5  6
A  1  1  0  0  0  0
B  1  0  0  0  0  1
C  0  0  0  2  1  0

相反size您可以使用countsize计算NaN个值,count则不会。{/ p>