Python 跨一组数据帧应用一个值
我试图在类型匹配的每个组中汇总值,并将其应用于store=1的行 下面的A组示例包含一个store=1和三个store=2 我想将Level=A中的所有类型3汇总到store=1行 样本数据:Python 跨一组数据帧应用一个值,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我试图在类型匹配的每个组中汇总值,并将其应用于store=1的行 下面的A组示例包含一个store=1和三个store=2 我想将Level=A中的所有类型3汇总到store=1行 样本数据: data={'group':['A','A','A','A','B','B','B','B','B'],'store':['1','2','2','2','1','2','2','2','2'],'type':['3','3','1','5','0','5','5','num:['10','20','30
data={'group':['A','A','A','A','B','B','B','B','B'],'store':['1','2','2','2','1','2','2','2','2'],'type':['3','3','1','5','0','5','5','num:['10','20','30','40','50','60','80']
t1=pd.数据帧(数据)
组存储类型num
A 13 10
A 2 3 20
A 21 30
A 21140
B 1550
B2060
B 2 5 70
B 2 5 80
正确的输出应该是一个新列('new_num'),其中包含类型匹配的每个组的store=1行的列表
组存储类型num new\u num
A 13 10['10','20']
A 2 3 20[]
A 21 30[]
A 21 40[]
B15500[50','70','80']
B 2 0 60[]
B 2 5 70[]
B 2 5 80[]
IIUC
设置
1) 使用一些不可靠的字符串concat和
groupby
u = t1.group + t1.type
check = u[t1.store.eq('1')]
m = t1.loc[u.isin(check)].groupby('group')['num'].agg(list)
res.loc[res.store.eq('1'), 'new_num'] = m
2) 如果你想离灯光更远,可以使用一个讨厌的
pivot
f = t1.pivot_table(
index=['group', 'type'],
columns='store',
values='num',
aggfunc=list
).reset_index()
m = f[f['1'].notnull()].set_index('group').drop('type', 1).sum(1)
res.loc[res.store.eq('1'), 'new_num'] = m
两者都设法产生:
store type num new_num
group
A 1 3 10 [10, 20]
A 2 3 20 []
A 2 1 30 []
A 2 1 40 []
B 1 5 50 [50, 70, 80]
B 2 0 60 []
B 2 5 70 []
B 2 5 80 []
虽然使用了
pivot
,但实际上我认为该解决方案非常简洁:
store group type 1 2
0 A 1 NaN [30, 40]
1 A 3 [10] [20]
2 B 0 NaN [60]
3 B 5 [50] [70, 80]
它生成上述聚合,您可以找到非空值,这些值是您所追求的所有匹配组类型组合,跨这些行求和将为您提供所需的聚合列表。这似乎是一个不明确的问题,您需要为每个组使用类型的最大出现次数来创建新值?很抱歉,这是一个非常棘手的问题。我想创建一个新的_num列,它是“store=1”的每一行中每个“group”的所有“num”的列表,其中“type”在每个group中匹配。因此我们需要为每个group匹配store 1中的任何类型?是的。对于第一行A组,我有store 1和type 3。我想为组A返回所有其他'num'值,其中store=2,type与store 1的类型匹配。我甚至没有耐心分析问题的内容。
store type num new_num
group
A 1 3 10 [10, 20]
A 2 3 20 []
A 2 1 30 []
A 2 1 40 []
B 1 5 50 [50, 70, 80]
B 2 0 60 []
B 2 5 70 []
B 2 5 80 []
store group type 1 2
0 A 1 NaN [30, 40]
1 A 3 [10] [20]
2 B 0 NaN [60]
3 B 5 [50] [70, 80]