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
答案 0 :(得分:0)
不确定我是否可以回答自己的问题,但由于问题已解决,我认为应该这样做。 即使我不明白我遇到的一些问题,解决方案也非常简单。
在合并中添加了on='id'
的第一个问题
df3 = df1[['id','sector']].merge(df2, on='id')
第二个问题只是缺少列表,如@DYZ指出的
df3.groupby(['sector','gender']).size()
现在感觉很愚蠢……一定很累。谢谢DYZ,很抱歉造成麻烦。