Итерация всех комбинаций значений в парном сравнении строк в Python
У меня есть фрейм данных с геномными ячейками в следующем формате. Каждый геномный диапазон представлен в виде строки, и значение ячейки соответствует этому началу бина.
0 1 2 3 4 5 ... 522
0 9248 9249 NaN NaN NaN NaN ... NaN
1 17291 17292 17293 17294 17295 NaN ... NaN
2 18404 18405 18406 18407 NaN NaN ... NaN
[69 rows x 522 columns]
Как вы можете видеть, многие значения строк являются неполными, потому что некоторые геномные диапазоны меньше, чем другие.
Я хочу сделать попарную комбинацию для каждого индекса по всей строке. Было бы хорошо, если бы каждое парное взаимодействие было сохранено как отдельный фрейм данных (предпочтительно даже).
Я хочу что-то вроде этого:
0 - 1 Pairwise:
0 1
9248 17291
9248 17292
9248 17293
9248 17294
9248 17295
9249 17291
9249 17292
9249 17293
9249 17294
9249 17295
[10 rows x 2 columns]
0 - 2 Pairwise:
0 2
9248 18404
9248 18405
9248 18406
9248 18407
9249 18404
9249 18405
9249 18406
9249 18407
[8 rows x 2 columns]
Мне нужна каждая комбинация значений для каждой попарной комбинации строк. Я думаю, что для этого нужно использовать itertools.product(), но не могу понять, как написать соответствующий цикл. Любая помощь очень ценится!
1 ответ
Настроить
from pandas.tools.util import cartesian_product as cp
df = pd.DataFrame({'0': {0: 9248, 1: 17291, 2: 18404},
'1': {0: 9249, 1: 17292, 2: 18405},
'2': {0: np.nan, 1: 17293.0, 2: 18406.0},
'3': {0: np.nan, 1: 17294.0, 2: 18407.0},
'4': {0: np.nan, 1: 17295.0, 2: np.nan},
'5': {0: np.nan, 1: np.nan, 2: np.nan},
'522': {0: np.nan, 1: np.nan, 2: np.nan}})
Решение
final={}
# use cartesian_product to get all the combinations for each row with other rows and add the results to the final dictionary.
df.apply(lambda x: [final.update({(x.name, i): np.r_[cp([x.dropna(), df.iloc[i].dropna()])].T}) for i in range(x.name+1,len(df))], axis=1)
верификация
for k, v in final.items():
print(k)
print(v)
(0, 1)
[[ 9248. 17291.]
[ 9248. 17292.]
[ 9248. 17293.]
...,
[ 9249. 17293.]
[ 9249. 17294.]
[ 9249. 17295.]]
(1, 2)
[[ 17291. 18404.]
[ 17291. 18405.]
[ 17291. 18406.]
...,
[ 17295. 18405.]
[ 17295. 18406.]
[ 17295. 18407.]]
(0, 2)
[[ 9248. 18404.]
[ 9248. 18405.]
[ 9248. 18406.]
...,
[ 9249. 18405.]
[ 9249. 18406.]
[ 9249. 18407.]]