如何在pandas.dataframe,python3中组装相同的元素

时间:2018-09-07 20:21:25

标签: python-3.x pandas dataframe

我有一个只有一个索引和两列的数据框。但是行数可能非常大(例如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 :(得分:2)

一种方法是融化,从id和列中分配一个新的location列,然后使用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']}