2017-07-12 10 views
1

熊貓操縱DF的問題在這裏搜索並從特定記錄/索引一個數據幀中添加值在特定的行/指數另一DF

我要創造我原來的DF(DF)的新列是來自另一個DF(dfKey)的特定索引處的值。

我有點卡住(我敢肯定我錯過了一些明顯的東西,但我無法解碼當前錯誤消息'KeyError: 'Name')。

數據:

import numpy as np 
import pandas as pd 
raw_data = {'Code': [250, 200, 875, 1200], 
    'Metric1': [1.4, 350, 0.2, 500], 
    'Metric999': [1.2, 375, 0.22, 505],} 
df = pd.DataFrame(raw_data, columns = ['Code','Metric1', 'Metric999',]) 

df.set_index('Code', inplace=True) #Set Code as Row Index 
print(df) 

raw_dataKey = {'Code': [250, 1200, 205, 2899, 875, 5005], 
    'Ticker': ['NVID', 'ATVI', 'CRM', 'GOOGL', 'TSLA','GE', ],  
    'Name': ['NVIDA Corp', 'Activision', 'SalesForce', 'Googlyness', 'Tesla Company','General Electric']} 
dfKey = pd.DataFrame(raw_dataKey , columns = ['Code','Ticker', 'Name']) 
dfKey.set_index('Code', inplace=True) #Set Code as Row Index 
print(dfKey) 

所需的輸出df.head()):

 Ticker   Name Code Metric1 Metric999 
Code 
250  NVID  NVIDA Corp 250  1.4  1.20 
200  NaN   NaN 200 350.0  375.00 
875  TSLA Tesla Company 875  0.2  0.22 
1200 ATVI  Activision 1200 500.0  505.00 

我認爲要做到這一點的最好辦法是一個for循環,因爲所有其他的方法我已經嘗試過(比如df['Name']=np.where(df['Code']==dfKey['Code'], dfKey['Name']))只能比較/測試相同索引下的每一行;沒有搜索。

我的最新嘗試:

codes=df.index.tolist() 
codes 

for code in codes: 
    #1. Find Name and Ticker in Key 
    name = dfKey['Name'].loc[code] 
    ticker = dfKey['Ticker'].loc[code] 
    #2. Put Name and Ticker back in original 
    df['Name'].loc[code] = name 
    df['Ticker'].loc[code] = ticker 

回答

2

我想你需要merge

dfKey.merge(df, left_index=True, right_index=True, how='outer') 

輸出:

 Ticker    Name Metric1 Metric999 
Code            
200  CRM  SalesForce 350.0  375.00 
250 NVID  NVIDA Corp  1.4  1.20 
875 TSLA  Tesla Company  0.2  0.22 
1200 ATVI  Activision 500.0  505.00 
2899 GOOGL  Googlyness  NaN  NaN 
5005  GE General Electric  NaN  NaN 
+0

Oh Duhh!我知道必須有一個更簡單的方法來做到這一點(需要愛Python語法)。速度的頂級答案(儘管我認爲MaxU的形式更加優雅)!謝謝! – whs2k

2

IIUC:

In [13]: df.join(dfKey) 
Out[13]: 
     Metric1 Metric999 Ticker   Name 
Code 
250  1.4  1.20 NVID  NVIDA Corp 
200  350.0  375.00 NaN   NaN 
875  0.2  0.22 TSLA Tesla Company 
1200 500.0  505.00 ATVI  Activision 
相關問題