匹配第三列的一列上的交叉表

JDr*_*per 5 python crosstab dataframe python-3.x pandas

我正在尝试基于第三列匹配的一列进行交叉表.以示例数据为例:

df = pd.DataFrame({'demographic' : ['A', 'B', 'B', 'A', 'C', 'C'],
                'id_match' : ['101', '101', '201', '201', '26', '26'],
                'time' : ['10', '10', '16', '16', '1', '1']})
Run Code Online (Sandbox Code Playgroud)

其中id_match匹配我想要找到人口统计列的交叉表的时间总和.输出看起来像这样:

  A  B  C
A 0  52 0
B 52 0  0
C 0  0  2
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的,如果没有评论.谢谢J

cs9*_*s95 1

您可以使用merge和解决此问题crosstab

u = df.reset_index()
v = u.merge(u, on='id_match').query('index_x != index_y')
r = pd.crosstab(v.demographic_x, 
                v.demographic_y, 
                v.time_x.astype(int) + v.time_y.astype(int), 
                aggfunc='sum')

print(r)
demographic_y     A     B    C
demographic_x                 
A               NaN  52.0  NaN
B              52.0   NaN  NaN
C               NaN   NaN  4.0
Run Code Online (Sandbox Code Playgroud)

如果您需要用零填充 NaN,您可以使用fillna

r.fillna(0, downcast='infer')

demographic_y   A   B  C
demographic_x           
A               0  52  0
B              52   0  0
C               0   0  4
Run Code Online (Sandbox Code Playgroud)