熊猫-无法合并df / series和groupby,然后计数

时间:2018-11-25 01:32:02

标签: python pandas dataframe

TL; DR: 有2个大小不同的数据帧,但有一个“ id”列(在两个df中)应该用作索引。需要合并它们,按“部门”和“性别”分组,并在每个组中计数/求和。

长版:

我有一个数据框,其中包含公司人员的“ id”,“ sector”等信息。另一个带有“ id”和“ gender”的数据框。例子如下:

df1:

row*  id     sector           other columns
1     0      Operational           ...
2     0      Administrative        ...
3     1      Sales                 ...
4     2      IT                    ...
5     3      Operational           ...
6     3      IT                    ...
7     4      Sales                 ...
      [...]
150   100    Operational           ...
151   100    Sales                 ...
152   101    IT                    ...

*我并不是真的没有“行”列,它只是为了使我的问题更容易理解。

df2:

row*      id     gender
1         0      Male
2         1      Female
3         2      Female
4         3      Male
5         4      Male
          [...]
101       100    Male
102       101    Female

如您所见,一个人可能在一个部门以上(这似乎使我的问题更加复杂)。 我需要将它们合并在一起,然后从每个部门的男性和女性人数中得出总和。

第一个问题

决定创建一个新的df,以仅获取列“ id”和“ sector”。

df3 = df1[['id','sector']]
df3 = df3.merge(df2)

我得到:

  

没有要执行合并的公共列。合并选项:left_on = None,   right_on = None,left_index = False,right_index = False

尝试使用.join()代替.merge(),我得到:

  

['id']不在索引中”

现在尝试使用reset_index()-在此处找到了一些答案,但并没有真正解决我的问题。

df1 = df1.reset_index() 
df3 = df1[['id','sector']] 
df3 = df3.join(df2)

我得到的是这个

row*  id     sector                gender
1     0      Operational           Male
2     0      Administrative        Female
3     1      Sales                 Female
4     2      IT                    Male
5     3      Operational           Male
6     3      IT                    ...
7     4      Sales                 ...
          [...]
150   100    Operational           NaN
151   100    Sales                 NaN
152   101    IT                    NaN

它不尊重“ id”,只是将列连接到一边。由于df2仅具有102行,因此除了“性别”不再准确之外,我在其他行(103至152)中也有NaN

第二个问题

决定继续努力,以便完成其余工作。我尝试过:

df3 = df3.groupby('sector','gender').size()

它引发:

  

对于对象类型,没有名为性别的轴<类'pandas.core.frame.DataFrame'>

对我来说,什么都不是真正有意义的,因为我可以打电话给df3.gender并且得到(整个)期望的序列。如果我从上面的行中删除“性别”,它实际上会分组,但这对我不起作用。还尝试将列名从befor传递给groupby,但无济于事。

预期结果应如下所示:

sector          gender   sum
operational     male     20
operational     female   5
administrative  male     10
administrative  female   17
sales           male     12
sales           female   13
IT              male     1
IT              female   11

1 个答案:

答案 0 :(得分:0)

不确定我是否可以回答自己的问题,但由于问题已解决,我认为应该这样做。 即使我不明白我遇到的一些问题,解决方案也非常简单。

在合并中添加了on='id'的第一个问题

df3 = df1[['id','sector']].merge(df2, on='id')

第二个问题只是缺少列表,如@DYZ指出的

df3.groupby(['sector','gender']).size()

现在感觉很愚蠢……一定很累。谢谢DYZ,很抱歉造成麻烦。