Pandas将多个分类列透视到同一组列中

2024-05-19 14:42:33 发布

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

我有一个数据帧,如下所示:

import pandas as pd
data = {
    'Num' : ['1','2', '3','4','5','6','7'],
    'col1': ['val1', 'val6', 'val3', 'val7', 'val2','val4','val5'],
    'col2': ['','val3','val5','','','',''],
    'col3': ['','val1','val2','','','','']
}
df = pd.DataFrame(data)
df["myvals"]=1

   Num  col1    col2    col3    myvals
0   1   val1                      1
1   2   val6    val3    val1      1
2   3   val3    val5    val2      1
3   4   val7                      1
4   5   val2                      1
5   6   val4                      1
6   7   val5                      1

我正在尝试将“col1”、“col2”和“col3”中的值透视到同一组“透视列”中,但到目前为止,我只能捕获“col1”中的值:

pd.pivot_table(df, values="myvals", index=["Num"], columns="col1", fill_value=0)

    col1    val1    val2    val3    val4    val5    val6    val7
    Num                         
    1         1       0       0       0      0        0       0
    2         0       0       0       0      0        1       0
    3         0       0       1       0      0        0       0
    4         0       0       0       0      0        0       1
    5         0       1       0       0      0        0       0
    6         0       0       0       1      0        0       0
    7         0       0       0       0      1        0       0

关于如何将“col2”和“col3”的值也引入到下面的“Num”=2和“Num”=3的行应该有多个1的地方,有什么想法吗?你知道吗

col1    val1    val2    val3    val4    val5    val6    val7
Num                         
1         1       0       0       0      0        0       0
2         1       0       1       0      0        1       0
3         0       1       1       0      1        0       0
4         0       0       0       0      0        0       1
5         0       1       0       0      0        0       0
6         0       0       0       1      0        0       0
7         0       0       0       0      1        0       0

Tags: dfdatanumcol2col3col1pdval1
1条回答
网友
1楼 · 发布于 2024-05-19 14:42:33

这更像是一个get_dummies问题

df.replace('',np.nan).set_index('Num').stack().str.get_dummies().sum(level=0)
Out[1125]: 
     val1  val2  val3  val4  val5  val6  val7
Num                                          
1       1     0     0     0     0     0     0
2       1     0     1     0     0     1     0
3       0     1     1     0     1     0     0
4       0     0     0     0     0     0     1
5       0     1     0     0     0     0     0
6       0     0     0     1     0     0     0
7       0     0     0     0     1     0     0

相关问题 更多 >