我正在努力交换数据帧的2列中的值,如下所示:
rs649071 rs640249 0.265 0.49
rs647621 rs640249 0.227 0.34
rs644339 rs640249 0.116 0.08
rs641563 rs640249 1.0 33.96
rs640249 rs11073074 0.248 0.77
rs640249 rs11637397 0.194 0.68
想法是测试第2列的每个单元格是否为rs640249,如果不是,则从第1列更改为相应的字符串,反之亦然。这样最终的结果将是:
rs649071 rs640249 0.265 0.49
rs647621 rs640249 0.227 0.34
rs644339 rs640249 0.116 0.08
rs641563 rs640249 1.0 33.96
rs11073074 rs640249 0.248 0.77
rs11637397 rs640249 0.194 0.68
我试图迭代元组,但是,元组不支持项目分配。
rscode='rs640249'
for inf in LDfiles:
df = read_csv(inf, sep='\t', skiprows=1, names=['A', 'B', 'C'])
for tup in df.itertuples():
if tup[2] != rscode:
tup[1], tup[2] = tup[2], tup[1]
print(tup)
答案 0 :(得分:1)
执行此操作的一种方法是使用apply:
def my_fun(row):
if row['col1'] == 'rs640249':
return row['col2'], row['col1']
else:
return row['col1'], row['col2']
df = df.apply(my_fun, axis=1)
如果您只想更改一列中的值,您仍然可以使用apply
:
def my_fun2(row, colID):
if row[colID][0] == 'rs640249':
return row[colID][::-1] #reverse the tuple
else:
return row[colID]
df[colID] = df.apply(lambda x: my_fun2(x, colID), axis=1)
注意:由于my_fun2
返回单个值,因此这次apply
会返回一个系列,因此我们需要稍微更改应用的方式。
示例:
df
# 0
# 0 ('rs649071', 'rs640249')
# 1 ('rs640249', 'rs11073074')
df[0] = df.apply(lambda x: my_fun2(x,0), axis=1)
# 0
# 0 ('rs649071', 'rs640249')
# 1 ('rs11073074', 'rs640249')
答案 1 :(得分:0)
对于将来的参考,这里有一个可能的解决方案:
for row_index, row in df.iterrows():
if row['L1'] == 'rs640249':
df.set_value(row_index, 'L1' , row['L2'])
df.set_value(row_index, 'L2' , row['L1'])
最佳,
答案 2 :(得分:0)
为什么不尝试使用数组操作:
condition = df['L1'] == 'rs640249'
tmp = df['L1'].copy()
df['L1'][condition] = df['L2'][condition]
df['L2'][condition] = tmp[condition]