我有一个只有一个索引和两列的数据框。但是行数可能非常大(例如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
吗?
谢谢!
答案 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']}