2017-10-22 35 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太棒了!不要忘記投票並接受。謝謝。 –

相關問題