1

我正在努力从数据框的 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)
4

3 回答 3

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返回的是一个Series,所以我们需要稍微改变一下我们申请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')
于 2012-09-28T22:50:31.837 回答
1

对于未来的裁判,这里有一个可能的解决方案:

    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'])

最好的,

于 2012-10-01T20:43:43.057 回答
0

你为什么不尝试这样的事情,使用数组操作:

condition = df['L1'] == 'rs640249'
tmp = df['L1'].copy()
df['L1'][condition] = df['L2'][condition]
df['L2'][condition] = tmp[condition]
于 2012-10-20T19:42:29.593 回答