Python 熊猫:基于类别索引的联接系列
我有两个pd系列:Python 熊猫:基于类别索引的联接系列,python,pandas,join,indexing,categories,Python,Pandas,Join,Indexing,Categories,我有两个pd系列: A idx 200 1 300 2 400 3 A B cat [200, 300) 1 3 [300, 400) 2 4+5+6+7 [400, 500) 3 NaN 长度为n和 B idx 200 4 350 5 360 6 370 7 380 8 长度为m。 请注意,系列的长
A
idx
200 1
300 2
400 3
A B
cat
[200, 300) 1 3
[300, 400) 2 4+5+6+7
[400, 500) 3 NaN
长度为n和
B
idx
200 4
350 5
360 6
370 7
380 8
长度为m。
请注意,系列的长度可以不同
我想要一个分类索引:
cat
[200, 300)
[300, 400)
[400, 500)
并在以下pd.系列之间进行关联:
A
idx
200 1
300 2
400 3
A B
cat
[200, 300) 1 3
[300, 400) 2 4+5+6+7
[400, 500) 3 NaN
那么,如何将基于索引的数据放入类别索引中,并对属于同一类别的条目进行求和呢?
我试过使用groupby,但我无法通过分类进行groupby。
THX:
数据设置:
a = pd.Series(data=[1,2,3],index=[200,300,400])
b = pd.Series(data=[4,5,6,7,8], index=[200,350,360,370,380])
转换为数据帧并使用pd.cut创建类别
df_a = a.to_frame()
df_a['cat'] = pd.cut(df_a.index,bins=[0,100,200,300,400,500,600], labels=['0-99','100-199','200-299','300-399','400-499','500-599'])
df_b = b.to_frame()
df_b['cat'] = pd.cut(df_b.index,bins=[0,100,200,300,400,500,600], labels=['0-99','100-199','200-299','300-399','400-499','500-599'])
在cat上执行groupby
,并使用pd.concat
group_b = df_b.groupby('cat')[0].apply(list)
group_b = group_b.where(group_b.str.len())
group_a = df_a.groupby('cat')[0].apply(list)
group_a = group_a.where(group_a.str.len())
pd.concat([group_a,group_b],axis=1,keys=['A','B'])
输出:
A B
cat
0-100 NaN NaN
101-200 [1] [4]
201-300 [2] NaN
301-400 [3] [5, 6, 7, 8]
401-500 NaN NaN
IIUC:
数据设置:
a = pd.Series(data=[1,2,3],index=[200,300,400])
b = pd.Series(data=[4,5,6,7,8], index=[200,350,360,370,380])
转换为数据帧并使用pd.cut创建类别
df_a = a.to_frame()
df_a['cat'] = pd.cut(df_a.index,bins=[0,100,200,300,400,500,600], labels=['0-99','100-199','200-299','300-399','400-499','500-599'])
df_b = b.to_frame()
df_b['cat'] = pd.cut(df_b.index,bins=[0,100,200,300,400,500,600], labels=['0-99','100-199','200-299','300-399','400-499','500-599'])
在cat上执行groupby
,并使用pd.concat
group_b = df_b.groupby('cat')[0].apply(list)
group_b = group_b.where(group_b.str.len())
group_a = df_a.groupby('cat')[0].apply(list)
group_a = group_a.where(group_a.str.len())
pd.concat([group_a,group_b],axis=1,keys=['A','B'])
输出:
A B
cat
0-100 NaN NaN
101-200 [1] [4]
201-300 [2] NaN
301-400 [3] [5, 6, 7, 8]
401-500 NaN NaN
谢谢如广告所示,除了我必须使用group_b=df_b.groupby('cat')[0]。sum()
而不是group_b=df_b.groupby('cat')[0]。应用(list)
以获得我想要的结果。啊。。。我以为你想要的是一份价值清单,而不是实际的总和。很好,我很高兴它成功了。干杯,谢谢!如广告所示,除了我必须使用group_b=df_b.groupby('cat')[0]。sum()
而不是group_b=df_b.groupby('cat')[0]。应用(list)
以获得我想要的结果。啊。。。我以为你想要的是一份价值清单,而不是实际的总和。很好,我很高兴它成功了。干杯