2017-02-19 163 views
1

我試圖用熊貓來實現一些看起來很簡單的東西,但是我在經過幾次不重要的測試之後卡住了。熊貓:基於更大的數據框更新Dataframe的系列

這是事情。我有一個數據框(我們稱之爲街道)只有兩個系列:街道名稱和與之相關的性別:

 name        gender 
0 Abraham Lincoln Avenue   undefined 
1 Donald Trump Dead End   undefined 
2 Hillary Clinton Street   undefined 
... 
1754 Ziggy Marley Boulevard   undefined 

在另一方面,我有一個其他數據框(我們稱之爲fnames),非常非常巨大。它有四大系列:

 gender gender_detail main_gender  first_name 
0  F  Female   Female   Aaf 
1  F  Female   Female   Aafke 
2  F  Female   Female   Aafkea 
3  M  Male   Male    Aafko 
... 
40211 F  Female   Female   Zyta 

所以像你已經猜到肯定,我會用fnames的「FIRST_NAME」系列,以檢查名字的一個出現或不街道的「名稱」系列。

如果找到了第一個名字,我會更新街道上的'性別'系列,並將其名爲「性別」的名人系列的相關價值更新。如果不是,我讓'未定義'。

很明顯,我不能使用兩個for循環,因爲Dataframes的大小......有沒有什麼快速的解決方案來實現呢?

例如,我應該創建一個只有名字作爲關鍵字和性別作爲值更高效的字典嗎?

PS:我不知道它是否可以簡化問題,但我的兩個數據框按字母順序排序!

回答

1

是的,我想你可以通過split通過whitespace使用dict與分裂柱namemapstr[0]選擇的第一價值,最後更換NaN通過fillna

print (df1) 
         name  gender 
0  Abraham Lincoln Avenue undefined 
1  Donald Trump Dead End undefined 
2  Hillary Clinton Street undefined 
3     Aaf Street undefined 
1754 Ziggy Marley Boulevard undefined 

print (df2) 
     gender gender_detail main_gender first_name 
0   F  Female  Female  Aaf 
1   F  Female  Female  Aafke 
2   F  Female  Female  Aafkea 
3   F  Female  Female  Aafko 
40211  F  Female  Female  Zyta 
d = df2.set_index('first_name')['gender'].to_dict() 
print (d) 
{'Zyta': 'F', 'Aaf': 'F', 'Aafkea': 'F', 'Aafke': 'F', 'Aafko': 'F'} 

print (df1['name'].str.split().str[0]) 
0  Abraham 
1  Donald 
2  Hillary 
3   Aaf 
1754  Ziggy 
Name: name, dtype: object 

df1['gender'] = df1['name'].str.split().str[0].map(d).fillna('undefined') 
print (df1) 
         name  gender 
0  Abraham Lincoln Avenue undefined 
1  Donald Trump Dead End undefined 
2  Hillary Clinton Street undefined 
3     Aaf Street   F 
1754 Ziggy Marley Boulevard undefined 
+0

神奇jezrael,只是測試,它工作得很好!非常感謝你! – Raphadasilva

+0

嗨@jezrael!兩個問題,如果你有一分鐘​​。我注意到,如果df1 ['name']只有一個部分(例如「Mainstreet」),我會自動獲得d的第一個條目(而不是'undefined')。第二點涉及幾個部分的名稱(如'戴高樂')。你認爲有什麼方法可以在不刪除以前的工作的情況下用這兩種特殊情況更新df1 ['name']?預先感謝,並有一個愉快的週末;-)! – Raphadasilva

+0

你可以用'df1 = df1 [df1.name.str.split()。str.len()!= 1]'過濾掉所有的行,它是如何工作的?第二個問題有點問題,解決方法是用第二個空白符分隔參數n,並用第一個'df1 ['gender'] = df1 ['name']合併替換。str.split()。str [0] .map(d )''twowordsname = df1 ['name']。str.split(n = 1).str [0] .map(d)''df1 ['gender'] = df1 ['gender']。combine_first(twowordsname) .fillna( '未定義')'。現在我只是在電話上,所以未經測試,請檢查它,如果有什麼問題讓我知道。愉快的週末。 – jezrael

相關問題