如何在Pandas数据框中为不同的列应用不同的函数?[duplicate]

dfuffjeb  于 2023-02-02  发布在  其他
关注(0)|答案(3)|浏览(124)
    • 此问题在此处已有答案**:

Apply multiple functions to multiple groupby columns(7个答案)
15小时前关门了。
我有一张发货表:
| 预订订单|驱动程序名称|吨位|停止名称|包裹|公斤|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 小行星2794|约翰|三个|华沙|二百|一百八十|
| 小行星2794|约翰|三个|拉多姆|三百|二百七十|
| 小行星2794|约翰|三个|克拉科夫|一百五十|一百三十五|
| 小行星3005|马克|五个|格但斯克|五百|四百五十|
| 小行星3005|法兰克|五个|格丁尼亚|四百|三六零|
| 小行星3005|法兰克|五个|索波特|一百二十三|十、七|
任务是按预订顺序对所有行进行分组,并将司机姓名、吨位和停靠站名称显示为内部唯一值(使用不同的分隔符设置),以及包裹和公斤的总和。
所需结果如下:
| 预订订单|驱动程序名称|吨位|停止名称|包裹|公斤|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 小行星2794|约翰|三个|华沙〉拉多姆〉克拉科夫|六百五十|五八五|
| 小行星3005|马克弗兰克|五个|格但斯克〉格丁尼亚〉索波特|小行星|九百二十点七|
我只会分组,但不知道如何正确地对不同的列应用不同的方法

import pandas as pd
excel=pd.read_excel('source.xlsx')
result=excel.groupby('booking_order').agg(lambda x: list(x)).reset_index()
result.to_excel('result1.xlsx')
jaql4c8m

jaql4c8m1#

groupbyagg与聚合函数的dict一起使用:

aggfunc = {'driver_name': lambda x: ','.join(x.unique()),
           'tonnage': 'first',
           'stop_name': '>'.join,
           'parcels': 'sum',
           'kgs': 'sum'}
result = excel.groupby('booking_order', as_index=False).agg(aggfunc)

输出:

>>> result
   booking_order driver_name  tonnage            stop_name  parcels    kgs
0           2794        John        3  Warsaw>Radom>Krakow      650  585.0
1           3005  Mark,Frank        5  Gdansk>Gdynia>Sopot     1023  820.7
kd3sttzy

kd3sttzy2#

您可以单独进行聚合。

import pandas as pd

df = pd.DataFrame({"A": ["a", "b", "a", "b"], "B": [1,2,3,4], "C": [5,6,7,8]})

group_obj = df.groupby("A")

grouper_b = group_obj.B.mean()
grouper_c = group_obj.C.max()

result = pd.concat([grouper_b, grouper_a], axis=1)

或者将func中的选项传递给agg

df.groupby("A").agg({"B": min, "C": max})
nnsrf1az

nnsrf1az3#

用途:

result=(excel.groupby(['booking_order'], as_index=False)
             .agg(driver_name=('driver_name',lambda x: ','.join(x.unique())),
                  tonnage=('tonnage','first'),
                  stop_name=('stop_name','>'.join),
                  parcels=('parcels','sum'),
                  kgs=('kgs','sum')))
print (result)
   booking_order driver_name  tonnage            stop_name  parcels    kgs
0           2794        John        3  Warsaw>Radom>Krakow      650  585.0
1           3005  Mark,Frank        5  Gdansk>Gdynia>Sopot     1023  820.7

相关问题