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
最终结果反映了我想要的内容
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中
对我来说很难。如果您能帮助我,我将不胜感激。
谢谢您的阅读。
对于任务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,无法完全理解其逻辑。
第一部分将DataFrame.explode
和DataFrame.explode
与DataFrame.dropna
和DataFrame.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
有趣的锻炼。
DataFrame.set_index