如何使用Pandas提取分组均值结果第二行的数值并添加至原DataFrame
我拥有一个名为train的DataFrame,包含business_code、cust_number、name_customer、clear_date、buisness_year、doc_id、posting_date、due_in_date、baseline_create_date、cust_payment_terms、converted_usd等列,数据行数约为9800行,部分数据如下:
| business_code | cust_number | name_customer | clear_date | buisness_year |
|---|---|---|---|---|
| U001 | 0200769623 | WAL-MAR corp | 2020-02-11 | 2020.0 |
| U001 | 0200980828 | BEN E | 2019-08-08 | 2019.0 |
| U001 | 0200792734 | MDV/ trust | 2019-12-30 | 2019.0 |
| U001 | 0200769623 | WAL-MAR foundation | 2019-11-25 | 2019.0 |
| CA02 | 0140106181 | THE corporation | 2019-12-04 | 2019.0 |
| doc_id | posting_date | due_in_date | baseline_create_date | cust_payment_terms | converted_usd |
|---|---|---|---|---|---|
| 1.930438e+09 | 2020-01-26 | 2020-02-10 | 2020-01-26 | NAH4 | 54273.28 |
| 1.929646e+09 | 2019-07-22 | 2019-08-11 | 2019-07-22 | NAD1 | 79656.6 |
| 1.929874e+09 | 2019-09-14 | 2019-09-29 | 2019-09-14 | NAA8 | 2253.86 |
| 1.930148e+09 | 2019-11-13 | 2019-11-28 | 2019-11-13 | NAH4 | 33133.29 |
| 2.960581e+09 | 2019-09-20 | 2019-10-04 | 2019-09-24 | CA10 | 15558.088 |
我已使用Pandas的groupby方法执行如下操作:
dt=train.groupby('name_customer')['delay'].mean(numeric_only=False)
打印dt后得到如下结果:
name_customer 11078 us 17.0 17135 associates -10.0 17135 llc -3.0 236008 associates -3.0 99 CE 2.0 ... YEN BROS corp 0.0 YEN BROS corporation -0.5 YEN BROS llc -2.0 ZARCO co -1.0 ZIYAD us 6.0 Name: delay, Length: 3889, dtype: float64
请问是否有办法提取dt(分组均值结果)中第二行的均值数值,并将其添加到train数据集中?我刚接触CSV和DataFrame,若问题表述不当敬请谅解。
没问题,刚接触Pandas很正常,我来一步步帮你搞定这个需求!
首先,你得到的dt是一个Pandas Series对象,索引是客户名称,值是对应的延迟均值。要提取第二行的数值并添加到train里,分两步来:
1. 提取第二行的均值和对应客户
因为Series的索引是从0开始计数的,第二行对应的索引就是1,用iloc就能快速定位:
# 提取第二行的均值数值 second_mean = dt.iloc[1] # 如果需要知道这个均值对应的客户名称,可以这么获取 target_customer = dt.index[1]
执行后,second_mean就是你要的-10.0,target_customer就是"17135 associates"。
2. 将数值添加到train数据集
这里分两种常见的场景,你可以根据自己的需求选择:
场景一:给整个train新增一列,所有行都填充这个第二行的均值
如果只是想给所有行都加上这个固定值,直接赋值就行:
train['selected_group_mean'] = second_mean
这样train里就多了一列selected_group_mean,所有行的值都是-10.0。
场景二:只给对应客户的行添加这个均值,其他行留空
如果是想仅给name_customer为"17135 associates"的行标记这个均值,其他行用空值(NaN)填充,可以用numpy的where函数:
import numpy as np train['selected_group_mean'] = np.where(train['name_customer'] == target_customer, second_mean, np.nan)
这样只有匹配的行会显示-10.0,其他行显示NaN,方便后续筛选或处理。
额外补充:如果想把所有分组的均值都合并到train里
如果你其实是想给每个客户的行都添加上对应的分组均值(而不只是第二行),不用手动提取,用transform或者merge更高效:
# 方法1:用transform直接生成新列,最简便 train['customer_delay_mean'] = train.groupby('name_customer')['delay'].transform('mean', numeric_only=True) # 方法2:把dt转成DataFrame后用merge合并 dt_df = dt.reset_index(name='customer_delay_mean') train = train.merge(dt_df, on='name_customer', how='left')
这两种方法都会自动把每个客户的延迟均值对应到train的每一行,适合批量处理所有分组的情况。
内容的提问来源于stack exchange,提问作者GeNeRaL ShAdOw

