Поменять строки ячеек из 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]