我正在尝试汇总类型匹配的每个组中的值,并将其应用于store = 1的行。
下面的A组示例包含一个存储= 1和三个存储= 2。
我想将Level = A中的所有类型3汇总到store = 1行
样本数据:
data = {'group':['A','A','A','A','B','B','B','B'],'store':['1','2','2','2','1','2','2','2'],'type':['3','3','1','1','5','0','5','5'],'num':['10','20','30','40','50','60','70','80']}
t1=pd.DataFrame(data)
group store type num
A 1 3 10
A 2 3 20
A 2 1 30
A 2 1 40
B 1 5 50
B 2 0 60
B 2 5 70
B 2 5 80
正确的输出应该是新列('new_num'),其中包含类型匹配的每个组的store = 1行处的列表。
group store type num new_num
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 []
答案 0 :(得分:2)
IIUC
t1['new_num']=[[] for x in range(len(t1))]
t1.loc[t1.store=='1','new_num']=[y.loc[y.type.isin(y.loc[y.store=='1','type']),'num'].tolist() for x , y in t1.groupby('group',sort=False)]
t1
Out[369]:
group store type num new_num
0 A 1 3 10 [10, 20]
1 A 2 3 20 []
2 A 2 1 30 []
3 A 2 1 40 []
4 B 1 5 50 [50, 70, 80]
5 B 2 0 60 []
6 B 2 5 70 []
7 B 2 5 80 []
答案 1 :(得分:2)
设置
ncol = [[] for _ in range(t1.shape[0])]
res = t1.set_index('group').assign(new_num=ncol)
1)使用一些不稳定的字符串连音和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]
它会产生上述汇总,您可以找到非空值,这些非空值是您要查找的所有匹配组类型组合,然后对这些行进行求和即可得出所需的汇总列表。