2017-10-22 116 views
2

我想从Pandas数据框中制作单个字典,其中N列中的每行指向在单列中的值,并想知道是否有一种有效的方法来做到这一点,而无需构建一堆for循环和字典更新。将Pandas数据框转换为N对1字典,其中N列是指向单个列的键作为值

例如,是一个更具编程/ Pandas'y的方式来完成以下内容。

import pandas as pd 
columns = ["A", "B", "C"] 
data = [[1, 11, 111], 
     [2, 22, 222], 
     [3, 33, 333]] 
df = pd.DataFrame(data=data, columns=columns) 
df 

Out[1]: 
    A B C 
0 1 11 111 
1 2 22 222 
2 3 33 333 


mdict = {} 
for c in df.columns: 
    mdict.update(dict(zip(df[c], df['A']))) 
mdict 

Out[2]: 
{1: 1, 2: 2, 3: 3, 11: 1, 22: 2, 33: 3, 111: 1, 222: 2, 333: 3} 

我最终想要创建的键长字典中的所有指回相同的值,这样我可以去到另一个数据框和运用地图功能,规范的条目。这本字典是否甚至需要一步,还是有一种更简单的方法来完成此操作,而无需通过中级字典?谢谢!

df2 = pd.DataFrame(data=[1, 11, 111, 2, 22, 222, 3, 33, 333], columns=['D']) 
df2['D'] = df2['D'].map(mdict) 
df2 

Out[3]: 
    D 
0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
6 3 
7 3 
8 3 

回答

1

这样做将是另一种方式:

g = df.set_index('A', drop=False).unstack() 
m = dict(zip(g.values, g.index.get_level_values(1))) 

m 
{1: 1, 2: 2, 3: 3, 11: 1, 22: 2, 33: 3, 111: 1, 222: 2, 333: 3} 

df1.D.map(m) 

0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
6 3 
7 3 
8 3 
Name: D, dtype: int64 

以类似的方式,你可以传递一个pd.Series对象地图。

s = pd.Series(g.index.get_level_values(1), index=g.values) 
s 

1  1 
2  2 
3  3 
11  1 
22  2 
33  3 
111 1 
222 2 
333 3 
Name: A, dtype: int64 

df1.D.map(s) 

0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
6 3 
7 3 
8 3 
Name: D, dtype: int64 
+0

正是我在找的,谢谢! – StuckOnDiffyQ

+0

@StuckOnDiffyQ太棒了!不要忘记投票并接受。谢谢。 –

相关问题