如何计算两个(或更多)因子的简单交叉表?

时间:2018-01-17 11:38:30

标签: python pandas

我必须以这样的方式跨越两个熊猫表:

表1

+-----+-----+
| id  |label|
+-----+-----+
| 1   |  2  |
| 2   |  0  |
| 3   |  1  |
+-----+-----+

表2:

+-----+-----+
| id  |label|
+-----+-----+
| 1   |  1  |
| 2   |  1  |
| 3   |  0  |
+-----+-----+

目标:

表3:跨表格的总和标签

+-----+---+---+---+
|     |1  |2  |3  |
+-----+---+---+---+
| 1   | 3 | 3 | 2 | 
| 2   | 1 | 1 | 0 |
| 3   | 2 | 2 | 1 |
+-----+---+---+---+

代码:

d = {'col1': [1, 2, 3], 'col2': [2, 0, 1]}
df1 = pd.DataFrame(data=d)

d = {'col1': [1, 2, 3], 'col2': [1, 1, 0]}
df2 = pd.DataFrame(data=d)

1 个答案:

答案 0 :(得分:1)

您可以通过广播添加两个向量来实现此目的 -

v = df1.label[:, None] + df2.label.values

或者,使用np.add.outer自动为您添加广告 -

v = np.add.outer(df1.label, df2.label)

最后,将结果转换为DataFrame -

pd.DataFrame(v, index=df1.id, columns=df2.id)

id  1  2  3
id         
1   3  3  2
2   1  1  0
3   2  2  1

对于第二个标题,构建一个MultiIndex -

idx = pd.MultiIndex.from_product([['header'], df2.id])
pd.DataFrame(v, index=df1.id, columns=idx)

   header      
        1  2  3
id             
1       3  3  2
2       1  1  0
3       2  2  1