背景
我有以下数据帧
import pandas as pd
df = pd.DataFrame({'Result' : [['pos', '+', 'pos', 'positive'], ['neg', 'neg'], [], ['pos']],
'P_ID': [1,2,3,4],
'Gene' : [['kras', 'kras', 'kras', 'egfr'], ['brca', 'brca'], [], ['cd133']],
'N_ID' : ['A1', 'A2', 'A3', 'A4']
})
#rearrange columns
df = df[['P_ID', 'N_ID', 'Gene', 'Result']]
df
P_ID N_ID Gene Result
0 1 A1 [kras, kras, kras, egfr] [pos, +, pos, positive]
1 2 A2 [brca, brca] [neg, neg]
2 3 A3 [] []
3 4 A4 [cd133] [pos]
我使用以下取自unnest (explode) multiple list 2.0的代码
df.set_index('P_ID').apply(lambda x: x.apply(pd.Series).stack()).ffill().reset_index().drop('level_1', 1)
问题
使用上面的代码,我接近我想要的。但是,因为第三行中的Gene
和Result
列是空列表[]
,所以我得到了上面行的输出,如下所示:
P_ID N_ID Gene Result
0 1 A1 kras pos
1 1 A1 kras +
2 1 A1 kras pos
3 1 A1 egfr positive
4 2 A2 brca neg
5 2 A2 brca neg
6 3 A3 brca neg
7 4 A4 cd133 pos
相反,我想得到下面的输出,其中下面的行6 3 A3 [] []
反映了原始数据帧df
,其中包含空列表
所需输出
P_ID N_ID Gene Result
0 1 A1 kras pos
1 1 A1 kras +
2 1 A1 kras pos
3 1 A1 egfr positive
4 2 A2 brca neg
5 2 A2 brca neg
6 3 A3 [] []
7 4 A4 cd133 pos
问题
如何获得所需的输出?你知道吗
让我们试试堆叠和拆散魔法。这也会保留空列表。你知道吗
细节
首先,将不被触摸的列设置为索引。你知道吗
接下来,
stack
行。你知道吗我们现在有一个系列。我们需要把这些元素分解成不同的列。所以,先加入列表,然后再拆分。假设列表元素本身不包含逗号(如果不包含逗号,请找到另一个分隔符进行连接和拆分)。你知道吗
我们需要去掉空值,所以再次调用
stack
。你知道吗我们快到了。现在我们希望索引的第二个最后一级成为我们的列,因此使用
unstack(-2)
(unstack
在第二个最后一级上取消堆栈)最后,一些管家,以获得我们原来的专栏。你知道吗
如果希望空格实际上是列表,请使用
applymap
:调整后
unnesting
仍适用于它相关问题 更多 >
编程相关推荐