使用pandas dataframe返回满足两个条件的列

时间:2016-06-28 20:41:43

标签: python numpy pandas dataframe

我是python的新手,在这里我有一个问题,我不知道如何解决,请帮忙。

这是事情:我有一个数据框,我想提取一个满足两种不同条件的列。

列如下:

     state gender  year       name  births
13299      AK      F  2013       Emma      57
13300      AK      F  2013     Sophia      50
13301      AK      F  2013    Abigail      39
13302      AK      F  2013   Isabella      38
13303      AK      F  2013     Olivia      36
13304      AK      F  2013  Charlotte      34
13305      AK      F  2013     Harper      34
13306      AK      F  2013      Emily      33
13307      AK      F  2013        Ava      31
13308      AK      F  2013      Avery      30
5742631    WY      M  2013     Emmett       5
5742632    WY      M  2013      Jesse       5
5742633    WY      M  2013      Jonah       5
5742634    WY      M  2013       Jude       5
5742635    WY      M  2013      Kaden       5
5742636    WY      M  2013      Kaleb       5
5742637    WY      M  2013      Kasen       5
5742638    WY      M  2013     Kellan       5

此数据框中有90K行,我想返回'name'的值,其中'gender'列尽可能均匀地分布到'M'和'F'。

或换句话说:我想在'births'列包含相同数量的'M'和'F'的条件下返回'name'的值。

对不起我是Python的新手,我已经坚持了很长一段时间。 我试图将数据框分成两个不同的数据框,并按照这种方式进行,但我发现它有点不可能。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

pandas中的数据透视表在这里工作正常:

pvt = pd.pivot_table(df,values='births',columns='gender',index='name',aggfunc='sum')
pvt[pvt['M'] == pvt['F']]

这将返回一个数据框,其名称为索引,M,F为列。男女皆宜的名字不太可能完全相同,所以你可以做一个像

这样的多元传统
pvt[(pvt['M'] + 10 > pvt['F']) & (pvt['M'] - 10 < pvt['F'])]

答案 1 :(得分:0)

我已定义df1进一步处理。我已将索引设置为['name', 'gender'],然后将unstack设置为性别&#39;进入专栏。 .births专注于分娩。然后我将min除以最大值以避免除以零。

df1 = df.set_index(['name', 'gender'], append=True).unstack().births.fillna(0)
df1.min(1).astype(float).div(df1.max(1)).sort_values(ascending=False)

这应该为您提供一个排序的数据框,其名称的最接近比率为1.