Поменять строки ячеек из 2 столбцов данных

Я изо всех сил, чтобы поменять значения из 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 ответа

Решение

Для будущих ссылок, здесь идет возможное решение:

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

Лучший,

Один из способов сделать это - применить 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')

Почему бы вам не попробовать что-то подобное с операциями с массивами:

condition = df['L1'] == 'rs640249'
tmp = df['L1'].copy()
df['L1'][condition] = df['L2'][condition]
df['L2'][condition] = tmp[condition]
Другие вопросы по тегам