2017-08-01 66 views
1

嗯,這是一個有點難以解釋....熊貓,結合2個dataframes信息和一個字典

假設你有2個大熊貓dataframes和1個字典。

df1 = pd.DataFrame(np.random.randn(5, 3), columns=['b', 'c','d']) 
df1['a'] = pd.Series(['1 A1-1','3 A1-1','8 A1-2','17 A1-3','45 A1-16'], index=df1.index) 
df1 = df1.reindex_axis(sorted(df1.columns), axis=1) 


df2 = pd.DataFrame([['1 A1-1',5],['2 A1-1',8],['3 A1-1',10],['8 A1-2',4],['17 A1-3',1],['45 A1-16',2]], columns = ['m','n']) 

dt = {'A1-1':100, 'A1-2':150, 'A1-3':200, 'A1-4':250, 'A1-5':300, 'A1-16':950} 

df1['a']df2['m']含有IDs,一些是相同的。 df2['n']包含附加值。 dt包含基本值ID團狀A1-1A1-2

我現在想比較/在df1df2dt讓我能到一個新的列添加到df1結合數據: 每當IDsdf1['a']df2['m']是相同的基礎值從字典中相同的字符串部分被添加到相應的df2['n']和結果然後轉移到df1['e']新列。

一個主要的問題我已經是字符串中的識別碼與字典鍵操作:e.g '1 A1-1'df1df2'A1-1'dt - 不知道如何將它們進行比較。

最有用的將是一個結果,如df1['e'] = pd.Series([105,110,154,201,952], index = df1.index)

感謝您的幫助。

回答

2

在我看來這是非常好的解釋問題。

首先split用空白柱a和選擇第二列表與str[1],然後通過dictmap並添加map編列a通過Seriesset_index創建:

df1['e'] = df1['a'].str.split().str[1].map(dt) + df1['a'].map(df2.set_index('m')['n']) 
print (df1) 
      a   b   c   d e 
0 1 A1-1 0.026375 0.260322 -0.395146 105 
1 3 A1-1 -0.204301 -1.271633 -2.596879 110 
2 8 A1-2 0.289681 -0.873305 0.394073 154 
3 17 A1-3 0.935106 -0.015685 0.259596 201 
4 45 A1-16 -1.473314 0.801927 -1.750752 952 

編輯:

映射函數使用的密鑰字典替換某些列中的值。按系列相似的地圖,只使用instaed鍵的值爲index值,而代替values使用值。

#sample data 
df = pd.DataFrame({'a':['bar','foo', 'baz'], 'b':[7,8,9]}) 
print (df) 
    a b 
0 bar 7 
1 foo 8 
2 baz 9 

#dict and df for mapping 
d = {'foo':15, 'bar':20} 
df2 = pd.DataFrame({'m':['baz','bar','foo'], 'n':[3,4,5]}) 
print (df2) 
    m n 
0 baz 3 
1 bar 4 
2 foo 5 

#create Series for map 
print (df2.set_index('m')['n']) 
m 
baz 3 
bar 4 
foo 5 
Name: n, dtype: int64 

df['c'] = df['a'].map(d) 
df['d'] = df['a'].map(df2.set_index('m')['n']) 
print (df) 
    a b  c d 
0 bar 7 20.0 4 
1 foo 8 15.0 5 
2 baz 9 NaN 3 
+0

非常好!非常感謝。雖然,在這種情況下,我並不完全掌握map的功能。請你給我一個簡單的解釋,以便如此善意。 – mati

+0

我嘗試編輯答案。請檢查一下。 – jezrael