Python 有没有办法用pandas聚合来解决这个多条件groupby?
我被这个复杂的groupby困在多个条件下。如果你能帮忙,我会非常感激的 输入数据帧: 我需要这种输出: 现在,我需要基于每个唯一的\u ID的groupby,如果\u Car\u和\u History==1,我需要每行的值和相同原始值的平均值 现在我正试图用这段代码解决这个问题,这需要时间:Python 有没有办法用pandas聚合来解决这个多条件groupby?,python,python-3.x,pandas,indexing,pandas-groupby,Python,Python 3.x,Pandas,Indexing,Pandas Groupby,我被这个复杂的groupby困在多个条件下。如果你能帮忙,我会非常感激的 输入数据帧: 我需要这种输出: 现在,我需要基于每个唯一的\u ID的groupby,如果\u Car\u和\u History==1,我需要每行的值和相同原始值的平均值 现在我正试图用这段代码解决这个问题,这需要时间: import pandas as pd data = [[1,120789,"2012-07-03",0,1000,500]\ , [1,232101,"2015-05-06",1,2300
import pandas as pd
data = [[1,120789,"2012-07-03",0,1000,500]\
, [1,232101,"2015-05-06",1,2300,700]\
, [1,329911,"2016-05-19",1,4000,1000]\
,[2,129088,"2011-01-01",0,1200,400]\
, [2,876541,"2013-03-01",1,1000,600]\
, [2,864347,"2014-05-03",0,3000,1000]\
, [2,987659,"2015-01-01",1,3200,700]]
df = pd.DataFrame(data,columns =["Unique_ID","Transaction_ID","Date","IF_Car_with_History","Value","Amount"])
for i in data.Unique_ID.unique():
df=data[data['Unique_ID']==i].reset_index(drop=True)
idx=df[df['IF_Car_with_History']==1].reset_index()['index'].tolist()
for s in idx:
tmp=pd.DataFrame()
hpa = df.iloc[s]["Transaction_ID"]
tmp=df.iloc[:s]
T_no = tmp["Transaction_ID"].iloc[-1]
# print(tmp.columns)
tmp=tmp.groupby(['Unique_ID'],as_index=False)\
.agg(Value= ('Value','sum')\
,Amount= ('Amount','mean')).reset_index(drop=True)
# print(tm2)
tmp["T_no"] = 0
tmp["T_no"][0] = T_no
tmp["HPA"] = 0
tmp['HPA'][0]=hpa
test_df = test_df.append(tmp)
此代码段花费了很长时间。有更好的解决方法吗?您可以这样做,按
唯一的\u ID
和如果有历史记录的\u Car\u进行分组,然后找到值的和平均值,并连接事务\u ID
:
df['Transaction_ID'] = df['Transaction_ID'].astype(str)
print(df.groupby(by=['Unique_ID', 'IF_Car_with_History'], as_index=False).agg(
{'Amount': ['sum'],
'Value': ['sum', 'mean'],
'Transaction_ID': ', '.join,
}))
输出:
Unique_ID IF_Car_with_History Amount Value Transaction_ID
sum sum mean join
0 1 0 500 1000 1000 120789
1 1 1 1700 6300 3150 232101, 329911
2 2 0 1400 4200 2100 129088, 864347
3 2 1 1300 4200 2100 876541, 987659
请不要共享数据pics@sammywemmy我也添加了数据。Thanks@jezrael如果你能帮我的话。对于你的回答,这将是greatThanks@NYC,但我的预期输出是不同的。