2014-06-15 59 views
0

假設我有一個如下的熊貓數據框。根據csv切片大熊貓數據框

df = pd.DataFrame({'Name' : ['A','B','C'], 
       'Country' : ['US','UK','SL']}) 

    Country Name 
0  US A 
1  UK B 
2  SL C 

而且我有一個像以下csv。

Name,Extended 
A,Jorge 
B,Alex 
E,Mark 
F,Bindu 

我需要檢查df['Name']是否CSV,如果是拿到了「擴展」。 如果不是,我只需要獲取「姓名」。所以我的預期輸出如下。

Country Name Extended 
0  US A Jorge 
1  UK B Alex 
2  SL C C 

以下顯示了我到目前爲止所嘗試的內容。

f = open('mycsv.csv','r') 
lines = f.readlines() 

def parse(x): 
    for line in lines: 
     if x in line.split(',')[0]: 
      return line.strip().split(',')[1] 

df['Extended'] = df['Name'].apply(parse) 

Name Country Extended 
0 A US Jorge 
1 B UK Alex 
2 C SL None 

我無法弄清楚如何讓「名」在「擴展」(代碼else部分)C?任何幫助。

回答

0

你可以只加載CSV作爲DF,然後分配使用where

df['Name'] = df2['Extended'].where(df2['Name'] != df2['Extended'], df2['Name']) 

所以在這裏我們使用布爾條件測試,如果「名」不等於「擴展」,並使用該值,否則只需使用'名稱'。

也是'擴展'總是不同或'名稱'相同?如果是這樣,爲什麼不只是分配擴展到數據幀的值:

df['Name'] = df2['Extended'] 

這會簡單得多。

1

您可以使用 「fillna」 功能從熊貓這樣的:

import pandas as pd 

df1 = pd.DataFrame({'Name' : ['A','B','C'], 
      'Country' : ['US','UK','SL']}) 
df2 = pd.DataFrame.from_csv('mycsv.csv', index_col=None) 

df_merge = pd.merge(df, f, how="left", on="Name") 
df_merge["Extended"].fillna('Name', inplace=True)