pandas groupby + 多个聚合/多列应用

克里斯

我有这个最少的样本数据:

import pandas as pd
from pandas import Timestamp

data = pd.DataFrame({'Client': {0: "Client_1",  1: "Client_2",  2: "Client_2",  3: "Client_3",  4: "Client_3",  5: "Client_3",  6: "Client_4",  7: "Client_4"},
 'Id_Card': {0: 1,  1: 2,  2: 3,  3: 4,  4: 5,  5: 6,  6: 7,  7: 8},
 'Type': {0: 'A',  1: 'B',  2: 'C',  3: np.nan,  4: 'A',  5: 'B',  6: np.nan,  7: 'B'},
 'Loc': {0: 'ADW',  1: 'ZCW',  2: 'EWC',  3: "VWQ",  4: "OKS",  5: 'EQW',  6: "PKA",  7: 'CSA'},
 'Amount': {0: 10.0,  1: 15.0,  2: 17.0,  3: 32.0,  4: np.nan,  5: 51.0,  6: 38.0,  7: -20.0},
 'Net': {0: 30.0,  1: 42.0,  2: -10.0,  3: 15.0,  4: 98,  5: np.nan,  6: 23.0,  7: -10.0},
 'Date': {0: Timestamp('2018-09-29 00:00:00'), 1: Timestamp('1996-08-02 00:00:00'), 2: np.nan, 3: Timestamp('2020-11-02 00:00:00'), 4: Timestamp('2008-12-27 00:00:00'), 5: Timestamp('2004-12-21 00:00:00'), 6: np.nan, 7: Timestamp('2010-08-25 00:00:00')}})
data

在此处输入图片说明

我正在尝试按Client聚合此数据分组计算Id_Card每个客户端的数量,连接Type, Loc,由;(例如A;B, NOT 的ZCW;EWC分隔,对, , 每个客户端求和,并获得每个客户端的最小值但是,我面临一些问题:Client_2A;ZCW B;EWCAmountNetDate

  1. 这些函数可以单独完美运行,但我找不到混合aggregate函数和apply函数的方法:

代码示例:

data.groupby("Client").agg({"Id_Card": "count", "Amount":"sum", "Date": "min"})
data.groupby('Client')['Loc'].apply(';'.join).reset_index()
  1. apply 函数对缺失值的列不起作用:

代码示例:

data.groupby('Client')['Type'].apply(';'.join).reset_index()
TypeError: sequence item 0: expected str instance, float found
  1. 聚合和应用函数不允许我为一个转换放置多个列:

代码示例:

cols_to_sum = ["Amount", "Net"]
data.groupby("Client").agg({"Id_Card": "count", cols_to_sum:"sum", "Date": "min"})

cols_to_join = ["Type", "Loc"]
data.groupby('Client')[cols_to_join].apply(';'.join).reset_index()

在 (3) 中,我只将AmountandNet我可以将它们分别放在聚合函数中,但我正在寻找一种更有效的方法,因为我正在处理大量列。

预期的输出是相同的数据帧,但与开头概述的条件聚合在一起。

加拉夫

要进行连接,您必须过滤掉 NaN 值。加入你必须在两个地方申请,我创建了一个单独的功能

def join_non_nan_values(elements):
    return ";".join([elem for elem in elements if elem == elem])  # elem == elem will fail for Nan values

data.groupby("Client").agg({"Id_Card": "count", "Type": join_non_nan_values,
                            "Loc": join_non_nan_values, "Amount":"sum", "Net": "sum", "Date": "min"})

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章