python - 合并两个 Pandas 交叉表 : Index and Col Name Issues

标签 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,以便最终表具有类别(即名称)列、来自 DF1 的 Loss & Win 列以及来自 DF2 的 Loss2 和 Win2 列。我假设这将允许我构建卡方所需的交叉表(见上文)。

最佳答案

答案 1
字典

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

关于python - 合并两个 Pandas 交叉表 : Index and Col Name Issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767368/

相关文章:

python - 将时间序列的时间精度降低到毫秒

python - 如何在 python pandas 代码中对散点图矩阵的间隔使用颜色编码?

python - 使用 CVXPY 求解拟凸问题

python - 在 Python 中禁用 SSL 证书验证

python - 如何在for循环中对数据帧执行逻辑运算?

Python/Tkinter : pack equivalent of grid_remove(), 例如。 pack_remove()?

python - 如何在递归函数中只运行一次语句

python - 用于更新数据帧 Python 中现有数据的检查器

跨选择的 Python Pandas XlsxWriter 中心

python - DataFrame 到嵌套 JSON