从2个数据帧列交换单元字符串

时间:2012-09-28 21:46:39

标签: python dataframe pandas compare-and-swap

我正在努力交换数据帧的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)

3 个答案:

答案 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]