通过变换最大值解决方案?

2024-09-28 20:55:45 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:

我的数据帧列是A中的ID(带有重复项)、时间值B和字符串值C

我需要更新所有的C值,其中C对应于每个ID A的最近时间B

显示ID(或ID组)的最新时间,但不包括C值:

df.groupby(['A'], as_index=False)['B'].max()

我在跌跌撞撞到.transform()后的尝试失败:

df['C'] = df.groupby('A')['B'].transform(['C'].max())
AttributeError: 'list' object has no attribute 'max'

数据

'a':['zx5','zx5','ab1','ab1','mn3','mn3'],
'b':['1/1/2021','1/2/2021','1/3/2021','1/4/2021','1/5/2021','1/4/2021'],
'c':['aaa','bbb','ccc','ddd','eee','fff']

所需结果:

'a':['zx5','zx5','ab1','ab1','mn3','mn3'],
'b':['1/1/2021','1/2/2021','1/3/2021','1/4/2021','1/5/2021','1/4/2021'],
'c':['bbb','bbb','ddd','ddd','eee','eee']

如果适用,我正在寻找一个有效的解决方案,因为它由包含100000多行数据的csv组成

编辑: 由于注释,我更新了IDS(A),使其不那么简单,将它们视为随机的字母数字值,排序不提供好处


Tags: 数据字符串iddfas时间transformmax
2条回答

我们可以转换b^{}(如果还没有)(为了正确的排序行为),然后^{},以便最大的b值是最后一个,然后^{}最后一个,并让索引对齐正确地关联这些值:

# df['b'] = pd.to_datetime(df['b'])  # Convert to_datetime if not already

df['c'] = df.sort_values('b').groupby('a')['c'].transform('last')

df

     a          b    c
0  zx5 2021-01-01  bbb
1  zx5 2021-01-02  bbb
2  ab1 2021-01-03  ddd
3  ab1 2021-01-04  ddd
4  mn3 2021-01-05  eee
5  mn3 2021-01-04  eee

通过%timeit的一些定时:

%timeit df.sort_values('b').groupby('a')['c'].transform('last')
275 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df['a'].map(df.sort_values(by='b').groupby('a')['c'].last())
322 µs ± 8.28 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

您可以按“a”+“b”排序,保留每个“a”组的最新“b”,并使用它映射新列“c”数据:

keys = df.sort_values(by='b').groupby('a')['c'].last()
df['c'] = df['a'].map(keys)

输出:

    a          b    c
0  A1 2021-01-01  bbb
1  A1 2021-01-02  bbb
2  A2 2021-01-03  ddd
3  A2 2021-01-04  ddd
4  A3 2021-01-05  eee
5  A3 2021-01-04  eee

相关问题 更多 >