Pandas:根据类别索引加入系列
Pandas: join series based on category index
我有两个 pd.Series:
A
idx
200 1
300 2
400 3
长度为 n 并且
B
idx
200 4
350 5
360 6
370 7
380 8
长度为 m。
请注意,系列的长度可以不同。
我想要一个类别索引:
cat
[200, 300)
[300, 400)
[400, 500)
并执行以下 pd.Series 之间的关联:
A B
cat
[200, 300) 1 3
[300, 400) 2 4+5+6+7
[400, 500) 3 NaN
那么如何根据索引将我的数据放入类别索引并对属于同一类别的条目进行求和?
我尝试使用 groupby,但我没有设法对类别进行分组。
谢谢
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
我有两个 pd.Series:
A
idx
200 1
300 2
400 3
长度为 n 并且
B
idx
200 4
350 5
360 6
370 7
380 8
长度为 m。 请注意,系列的长度可以不同。
我想要一个类别索引:
cat
[200, 300)
[300, 400)
[400, 500)
并执行以下 pd.Series 之间的关联:
A B
cat
[200, 300) 1 3
[300, 400) 2 4+5+6+7
[400, 500) 3 NaN
那么如何根据索引将我的数据放入类别索引并对属于同一类别的条目进行求和? 我尝试使用 groupby,但我没有设法对类别进行分组。 谢谢
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