我有一個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