【发布时间】:2021-03-31 23:15:19
【问题描述】:
数据:
import pandas as pd
dict= {'REF': ['A','B','C','D'],
'ALT': [['E','F'], ['G'], ['H','I','J'], ['K,L']],
'sample1': ['0', '0', '1', '2'],
'sample2': ['1', '0', '3', '0']
}
df = pd.DataFrame(dict)
问题:
我需要替换列“Sample1”和“Sample2”中的值。如果为 0,则应放置“REF”列值。如果为 1,则应放置“ALT”列中列表的第一个元素,如果为 2,则应放置“ALT”列列表中的第二个元素,依此类推。
我的解决方案:
sample_list = ['sample1', 'sample2']
for sample in sample_list:
#replace 0s
df[sample] = df.apply(lambda x: x[sample].replace('0', x['REF']), axis=1)
#replace other numbers
for i in range(1,4):
try:
df[sample] = df.apply(lambda x: x[sample].replace(f'{i}', x['ALT'][i-1]), axis=1)
except:
pass
但是,由于每个'ALT'列行的列表长度不同,似乎存在IndexError,并且值在1之后没有被替换。您可以从输出中看到:
'{"REF":{"0":"A","1":"B","2":"C","3":"D"},"ALT":{"0":["E","F"],"1":["G"],"2":["H","I","J"],"3":["K"]},"sample1":{"0":"A","1":"B","2":"H","3":"2"},"sample2":{"0":"E","1":"B","2":"3","3":"D"}}'
我该如何解决?
更新: 如果我在 sample1 或 sample2 中有 NaN 值,我无法将值转换为 int 并且不知道如何跳过这些值
因此,NaN 值不应被转换并保持为 NaN
预期输出:
【问题讨论】:
-
在示例 1 中,您有 2 个但列表中只有一个元素
-
即使是2个元素还是不行
-
我的问题是更多,在这些情况下应该怎么做?
-
我认为你的 ALT 栏有错字,K 和 L 应该分开。
标签: python pandas list replace