将列分为行并在交叉处添加多个标签

问题描述 投票:1回答:4

Task1

假定数据集

    Name    B   C
0   James   a   a,b,c,d
1   James   a   NaN
2   Rudy    b   a,f
3   Karl    c   e,c

在c列中,值是列表形式的,我想将它们拆分并添加到行中。删除C列为NaN的值

我想要的输出

    Name    B   C
0   James   a   a
1   James   a   b
2   James   a   c
3   James   a   d
4   Rudy    b   a
5   Rudy    b   f
6   Karl    c   e
7   Karl    c   c

Task2

我想根据James,Rudy,Karl和'C'列之间的关系进行标记。

标签标准平均交集)

Label    column 'C' value
 0       James  
 1       Rudy   
 2       Karl   
 3       James ∩ Rudy   
 4       James ∩ Karl       
 5       Rudy ∩ Karl        
 6       James ∩ Rudy ∩ Karl

我想根据每个同等的'C'值所属的位置进行标记。Label logic

最终结果反映了我想要的内容

    Name    B   C   Label
0   James   a   a   3
1   James   a   b   0
2   James   a   c   4
3   James   a   d   0
4   Rudy    b   a   3
5   Rudy    b   f   1
6   Karl    c   e   2
7   Karl    c   c   4

例如,'C'列中的'a'被标记为3,因为它同时出现在James和Rudy中

对我来说很难。如果您能帮助我,我将不胜感激。

谢谢您的阅读。

python pandas dataframe label multiple-columns
4个回答
1
投票

对于任务1,如果C列中的数据是您所说的列表,则可以使用explode。

df.explode('C').dropna()

    Name    B   C
0   James   a   a
0   James   a   b
0   James   a   c
0   James   a   d
2   Rudy    b   a
2   Rudy    b   f
3   Karl    c   e
3   Karl    c   c

对于任务2,无法完全理解其逻辑。


1
投票

第一部分将DataFrame.explodeDataFrame.explodeDataFrame.dropnaDataFrame.dropna用作默认索引:

DataFrame.reset_index

然后使用DataFrame.reset_index创建第二个系列,用于drop=True

#if values are lists
df1 = df.explode('C').dropna(subset=['C']).reset_index(drop=True)
#if values are separated by , add split
#df1 = df.assign(C = df['C'].str.split(',')).explode('C').dropna(subset=['C']).reset_index(drop=True)
print (df1)
    Name  B  C
0  James  a  a
0  James  a  b
0  James  a  c
0  James  a  d
2   Rudy  b  a
2   Rudy  b  f
3   Karl  c  e
3   Karl  c  c

0
投票

有趣的锻炼。

DataFrame.set_index

0
投票
DataFrame.set_index

结果:

Series.map
© www.soinside.com 2019 - 2024. All rights reserved.