合并两个Pandas Cross Tabs:索引和Col名称问题

时间:2017-05-03 18:19:27

标签: python pandas

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

1)我有两个交叉表,我想在一个df中。我需要更改列名称。我觉得这很容易。文档使它看起来很容易。框架的顶部看起来像这样:

Category    0.0 1.0
Name        
Bob         1   0

我希望它看起来像这样:

Category    Loss Win
Name        
Bob         1    0

当我尝试使用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)我梦想将上述内容加入到另一个交叉表中。我认为内部联接可能有效。如果名称出现在两个交叉表中,我希望它们在我的合并表中,如果没有,那么就忘了它们。但是,由于左表中的某些名称(让我们调用左表上方的表)没有出现在右表中(我在类别列上加入,这只是一个名称列表),内部联系是不行的。我的最终目标是使用看起来像的交叉频率表进行卡方检验。 。

           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加入到两者中出现的名称,使得最终表格具有类别(即名称)列,损失&从DF1中获取列,从DF2中获取Loss2和Win2列。我假设这将允许我构建我需要的卡方(见上文)。

1 个答案:

答案 0 :(得分:4)

回答1
dict

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

Category  Loss  Win
Name               
Bob          1    0

lambda

df.rename(columns=lambda x: 'Win' if x else 'Loss')

Category  Loss  Win
Name               
Bob          1    0

回答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