我有一个DF如下:同时更换多个列的内容为多个条件
CHROM POS SRR4216489 SRR4216675 SRR4216480
0 1 127536 ./. ./. ./.
1 1 127573 ./. 0/1:0,5:5:0:112,1,10 ./.
2 1 135032 ./. 1/1:13,0:13:3240:0,30,361 0/0:13,0:13:3240:0,30,361
3 1 135208 ./. 0/0:5,0:5:3240:0,20,160 0/1:5,0:5:3240:0,20,160
4 1 138558 1/1:5,0:5:3240:0,29,177 0/0:0,5:5:0:112,1,10 ./.
我想换成根据某些条件的样品列的内容。样本列是SRR4216489,SRR4216675,SRR4216480。我正在寻找替换'./。'与0.5,任何与0/0开始0.0和任何与0/1或1/1与1.0。我明白这涉及到几个过程,其中大部分我都可以独立完成,但我不知道将它们绑定在一起的语法。例如,我可以对样品SRR4216480做到这一点:
df['SRR4216675'][df.SRR4216675 == './.'] = 0.5
这种运作良好,courtesy of here,但我不知道如何将它同时适用于所有样品列。我认为通过使用循环:
sample_cols = df.columns[2:]
for s in sample_cols:
df[s][df.s =='./.'] = 0.5
但是这首先似乎并不十分pandonic,它也不会接受来自列表中“df.s”字符串反正。
下一个挑战是如何解析填充样本列其他部分的变量字符串。我已经使用分割功能的尝试:
df=df['SRR4216675'][df.SRR4216675.split(':') == '0/0' ] = 0.0
,但我得到:
TypeError: 'float' object is not subscriptable
我相信,一个好办法,这将是使用Lambda如this但作为新来大熊猫解决和lambda表达式我发现它非常棘手,我在这里:
col=df['SRR4216675'][df.SRR4216675.apply(lambda x: x.split(':')[0])]
,它看起来像它的几乎没有,但需要进一步的处理,以取代的价值,也是它看起来像它有2列的ð不会让我重新整合入现有的DF:
SRR4216675
./. NaN
0/1 NaN
1/1 NaN
0/0 NaN
0/0 NaN
df['SRR4216675'] = col
ValueError: cannot reindex from a duplicate axis
我明白,这是在1几个问题,但我是新来的熊猫和真的很想去处理它。我可以使用基本列表和循环来解决这些问题,这些列表使用Python标准列表,迭代和字符串解析函数,但是在规模上,这将非常慢,因为我的全尺寸df是数百万行,包含超过500个样本列。
查找到熊猫系列和成'pd.Series.replace()'方法的各种'.str'方法。例如:'df.loc [:, ['SRR4216489','SRR4216675','SRR4216480']]。replace(“./。”,0.5,inplace = True)' – Jakub