合并两个Pandas交叉表:索引和列名称问题

2024-06-01 08:37:38 发布

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

这是一个由两部分组成的问题:

1)我有两个交叉标签,我希望在一个df中。我需要更改列名。我以为这很容易。医生让它看起来很简单。框架顶部如下所示:

Category    0.0 1.0
Name        
Bob         1   0

我希望它看起来像这样:

^{pr2}$

当我尝试colnames=并得到一个错误时,我问它认为列名是什么并得到了。在

Float64Index([0.0, 1.0], dtype='float64', name='Category')

我试着用。在

colnames=['Loss', 'Win', 'Category']

但是我得到了:AssertionError: arrays and names must have the same length,这对我来说没有什么意义,因为我之前已经毫无问题地更改了df的列名。在

2)我梦想将上述内容加入另一个交叉表。我认为内部连接可能有用。如果名称出现在两个交叉表中,我希望它们出现在合并的表中,如果没有的话就忘了它们。但是,由于左表中的一些名称(让我们在左表上方调用表)没有出现在右表中(我要加入category列,这只是一个名称列表),内部联接是不可能的。我的最终目标是用交叉频率表进行卡方检验,它看起来像。在

           Category1    Win    Loss
Category2
    Win2                5      20

    Loss2               10      5

如果有任何关于解决一个或两个问题的建议,并让我进入梦想的方格,我将不胜感激。在

编辑:合并数据帧的例子,我想得到一个交叉频率/卡方。在

DF1:
    Category    Loss Win
    Name        
    Bob         1    0
    Alice       5    1
    Anne        1    0
    Betty       8    2
    Joan        4    1

DF2:
    Category2   Loss2 Win2
    Name        
    Alice       1    1
    Anne        0    1
    Betty       1    3
    Joan        1    1

Combined Table:
Category    Loss    Win  Loss2 Win2
    Name        
    Alice       5    1    1    1
    Anne        1    0    0    1
    Betty       8    2    1    3
    Joan        4    1    1    1

只在出现在两个表中的名称上联接DF1和DF2,这样最终的表就有一个Category(即names)列、DF1的Loss&Win列以及DF2中的Loss2和Win2列。我想这将允许我构建交叉表,我需要一个卡方(见上文)。在


Tags: name名称dfwin交叉df1df2alice
1条回答
网友
1楼 · 发布于 2024-06-01 08:37:38

答案1
dict

df.rename(columns={1: 'Win', 0: 'Loss'})

Category  Loss  Win
Name               
Bob          1    0

lambda

^{pr2}$

回答2
我不太清楚你想要什么

考虑以下数据帧d1d2

np.random.seed([3,1415])
d1 = pd.DataFrame(
    np.random.randint(10, size=(10, 2)),
    pd.Index(list('ABCDEFGHIJ'), name='Name'),
    pd.Index(['Loss', 'Win'], name='Category1')
)
d2 = pd.DataFrame(
    np.random.randint(10, size=(10, 2)),
    pd.Index(list('ABCDEFGHIJ'), name='Name'),
    pd.Index(['Loss', 'Win'], name='Category2')
)

您可以使用pd.concat

df = pd.concat({d.columns.name: d for d in [d1, d2]}, axis=1)
df

          Category1     Category2    
Category1      Loss Win      Loss Win
Name                                 
A                 0   2         3   6
B                 7   3         7   7
C                 8   7         4   5
D                 0   6         3   7
E                 8   6         5   9
F                 0   2         8   7
G                 0   4         6   4
H                 9   7         7   6
I                 3   2         2   6
J                 4   3         6   5

相关问题 更多 >