Python数据帧:同一列上的轴

2024-09-29 09:37:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两列“ID”和“division”,如下所示。在

df = pd.DataFrame(np.array([['111', 'AAA'],['222','AAA'],['333','BBB'],['444','CCC'],['444','AAA'],['222','BBB'],['111','BBB']]),columns=['ID','division'])

    ID  division
0   111 AAA
1   222 AAA
2   333 BBB
3   444 CCC
4   444 AAA
5   222 BBB
6   111 BBB

预期的输出如下所示,我需要在同一列上旋转,但计数取决于“除法”。这应该出现在热图中。在

^{pr2}$

所以,从技术上讲,我在做一个关于除法的ID的重叠。在

示例: 以红色突出显示的框中,111和222 ID之间的重叠为2(AAA和BBB)。其中111和444之间的重叠为1(在黑框中突出显示AAA)。在

enter image description here

我可以用excel在2中做这个台阶。不是当然,如果下面一个有帮助。 第一步:=SUM(COUNTIFS($B$2:$B$8,$B2,$A$2:$A$8,$G2),COUNTIFS($B$2:$B$8,$B2,$A$2:$A$8,H$1))-1 第二步:=IF($G12=H$1,0,SUMIFS(H$2:H$8,$G$2:$G$8,$G12))

但我们可以用Python的任何方式来做。 感谢你的帮助

案例2

if df = pd.DataFrame(np.array([['111', 'AAA','4'],['222','AAA','5'],['333','BBB','6'],
                            ['444','CCC','3'],['444','AAA','2'], ['222','BBB','2'],
                            ['111','BBB','7']]),columns=['ID','division','count'])

   ID   division count
0   111  AAA      4
1   222  AAA      5
2   333  BBB      6
3   444  CCC      3
4   444  AAA      2
5   222  BBB      2
6   111  BBB      7

预期产出将是

df_result = pd.DataFrame(np.array([['0','18','13','6'],['18','0','8','7'],['13','8','0','0'],['6','7','0','0']]),columns=['111','222','333','444'],index=['111','222','333','444'])

   111 222  333 444
111 0   18  13  6
222 18  0   8   7
333 13  8   0   0
444 6   7   0   0

计算:这里有111和222之间的重叠,关于分区AAA和BBB,因此总和将是4+5+2+7=18


Tags: columnsiddataframedfcountnparrayb2
1条回答
网友
1楼 · 发布于 2024-09-29 09:37:27

另一种方法是使用带有mergepd.crosstab的自连接:

df_out = df.merge(df, on='division')

results = pd.crosstab(df_out.ID_x, df_out.ID_y) 
np.fill_diagonal(results.values, 0)

输出:

^{pr2}$

案例2

df = pd.DataFrame(np.array([['111', 'AAA','4'],['222','AAA','5'],['333','BBB','6'],
                            ['444','CCC','3'],['444','AAA','2'], ['222','BBB','2'],
                            ['111','BBB','7']]),columns=['ID','division','count'])

df['count'] = df['count'].astype(int)
df_out = df.merge(df, on='division')

df_out = df_out.assign(count = df_out.count_x + df_out.count_y)

results = pd.crosstab(df_out.ID_x, df_out.ID_y, df_out['count'], aggfunc='sum').fillna(0) 
np.fill_diagonal(results.values, 0)

输出:

ID_y   111   222   333  444
ID_x                       
111    0.0  18.0  13.0  6.0
222   18.0   0.0   8.0  7.0
333   13.0   8.0   0.0  0.0
444    6.0   7.0   0.0  0.0

相关问题 更多 >