pandas:基于其他列将多行中的一个单元格值替换为一个特定行

2024-09-27 00:11:38 发布

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

我的目标是:

     uniqueIdentity    beginTime    progrNumber
0   2018-02-07-6253554  17:40:29    1
1   2018-02-07-6253554  17:40:29    2
2   2018-02-07-6253554  17:40:29    3
3   2018-02-07-6253554  17:40:29    4
4   2018-02-07-6253554  17:40:29    5
5   2018-02-07-5555333  17:48:29    2
6   2018-02-07-5555333  17:48:29    3
7   2018-02-07-5555333  17:48:29    4
8   2018-02-07-2345622  18:40:29    1
9   2018-02-07-2345622  18:40:29    2
10  2018-02-07-2345622  18:40:29    3
11  2018-02-07-2345622  18:40:29    4

我的数据集现在:

     uniqueIdentity    beginTime    progrNumber
0   2018-02-07-6253554  17:40:29    1
1   2018-02-07-6253554  17:41:15    2
2   2018-02-07-6253554  17:41:55    3
3   2018-02-07-6253554  17:42:54    4
4   2018-02-07-6253554  17:43:29    5
5   2018-02-07-5555333  17:49:15    2
6   2018-02-07-5555333  17:49:55    3
7   2018-02-07-5555333  17:50:54    4
8   2018-02-07-2345622  18:40:29    1
9   2018-02-07-2345622  18:41:15    2
10  2018-02-07-2345622  18:41:55    3
11  2018-02-07-2345622  18:42:54    4

这意味着: 对于具有相同“uniqueIdentity”的行,“beginTime”应替换为具有相同“uniqueIdentity”的单元格值,“progrNumber”是最小的“progrNumber”。


Tags: 数据目标begintimeprogrnumberuniqueidentity
3条回答

正如您在评论中提到的,最低的progrNumber也将是最低的beginTime。这意味着您可以使用groupbytransform获取每个uniqueIdentity的最低beginTime

注意,如果beginTime是string类型,则只有当它具有一致的格式时,才有效。(例如,“09:40:20”而不是“9:40:20”)

df['beginTime'] = df.groupby('uniqueIdentity').beginTime.transform('min')

        uniqueIdentity beginTime progrNumber
0   2018-02-07-6253554  17:40:29           1
1   2018-02-07-6253554  17:40:29           2
2   2018-02-07-5555333  17:48:29           3
3   2018-02-07-5555333  17:48:29           4
4   2018-02-07-6253554  17:40:29           3
5   2018-02-07-6253554  17:40:29           4
6   2018-02-07-5555333  17:48:29           1
7   2018-02-07-5555333  17:48:29           2
8   2018-02-07-2345622  18:40:29           1
9   2018-02-07-2345622  18:40:29           3
10  2018-02-07-2345622  18:40:29           4

使用groupbymap

假设beginTime对于最小的progrNumber总是最小的。根据问题的评论,这种情况是正确的

在这个答案中,我收集每个uniqueIdentity的最小起始时间,然后基于uniqueIdentity将其映射到原始数据帧

times = df.groupby('uniqueIdentity').beginTime.min()
df['beginTime'] = df.uniqueIdentity.map(times)

这里有另一个使用左连接和一些重命名的选项

    # find rows where progrNumber is 1 
    df_prog1=df[df.progrNumber==1]
    # do a left join on the original 
    df=df.merge(df_prog1,on='uniqueIdentity',how='left',suffixes=('','_y'))
    # keep only the beginTime from the right frame 
    df=df[['uniqueIdentity','beginTime_y','progrNumber']]
    # rename columns
    df=df.rename(columns={'beginTime_y':'beginTime'})
    print(df)

结果:

        uniqueIdentity beginTime  progrNumber
0   2018-02-07-6253554  17:40:29            1
1   2018-02-07-6253554  17:40:29            2
2   2018-02-07-6253554  17:40:29            3
3   2018-02-07-6253554  17:40:29            4
4   2018-02-07-5555333  17:48:29            1
5   2018-02-07-5555333  17:48:29            2
6   2018-02-07-5555333  17:48:29            3
7   2018-02-07-5555333  17:48:29            4
8   2018-02-07-2345622  18:40:29            1
9   2018-02-07-2345622  18:40:29            2
10  2018-02-07-2345622  18:40:29            3
11  2018-02-07-2345622  18:40:29            4

如果不确定uniqueIdentity内的哪个记录的时间最短,可以使用groupby而不是选择progrNumber==1的位置:

    df_prog1=df.groupby('uniqueIdentity')['beginTime'].min().reset_index()

并按上述方法进行左连接

相关问题 更多 >

    热门问题