Как собрать одинаковые элементы в pandas.dataframe, python3 - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть фрейм данных, который имеет только один индекс и два столбца. Но количество рядов может быть очень большим (например, 1000). Я хочу собрать одинаковые элементы из разных строк и столбцов. С помощью следующих кодов я уточняю свой вопрос.

import pandas as pd
data = dict()
data['id'] = ['r1','r2','r3','r4','r5','r6','r7','r8','r9','r10']
data['col1'] = [1,2,3,2,4,5,5,5,6,7]
data['col2'] = [2,3,4,4,5,6,6,6,0,0]
df = pd.DataFrame(data)
df = df.set_index('id')

Затем содержание df показано ниже.

df = 

    col1    col2
id

r1     1       2
r2     2       3
r3     3       4
r4     2       4
r5     4       5
r6     5       6
r7     5       6
r8     5       6
r9     6       0
r10    7       0

Например, df.loc['r1', 'col2'] и df.loc['r2', 'col1']) оба имеют номер 2. Основываясь на этом df, я хочу создать следующий словарь:

dict_result[2] = ['r1_col2', 'r2_col1']
...
dict_result[4] = ['r3_col2', 'r4_col2', 'r5_col1']
...
dict_result[0] = ['r9_col2', 'r10_col2']

Не могли бы вы показать мне, как эффективно получить такой dict_result? Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Один из способов - растаять, назначить новый столбец местоположения из идентификатора и столбца, а затем использовать groupby:

melted = df.reset_index().melt("id").assign(loc=lambda x: x["id"] + "_" + x["variable"])
result = {k: v.tolist() for k, v in melted.groupby("value")["loc"]}

, что дает мне

In [546]: result
Out[546]: 
{0: ['r9_col2', 'r10_col2'],
 1: ['r1_col1'],
 2: ['r2_col1', 'r4_col1', 'r1_col2'],
 3: ['r3_col1', 'r2_col2'],
 4: ['r5_col1', 'r3_col2', 'r4_col2'],
 5: ['r6_col1', 'r7_col1', 'r8_col1', 'r5_col2'],
 6: ['r9_col1', 'r6_col2', 'r7_col2', 'r8_col2'],
 7: ['r10_col1']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...