2017-02-19 130 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

相关问题