【问题标题】:Pandas : how to keep rows in groupby where column value = minPandas:如何将行保留在 groupby 中,其中列值 = min
【发布时间】:2018-07-24 00:22:14
【问题描述】:

这是我的数据集示例

side     |  serial_number   |   inspector  |   date_1        |    date_2
top      |       10         |   Paul       |   4/1/18 13:21  |    4/1/18 14:22
bot      |       10         |   Jack       |   4/1/18 13:01  |    4/1/18 14:22
bot      |       11         |   Jack       |   4/1/18 14:01  |    4/1/18 14:53
top      |       11         |   Paul       |   4/1/18 14:25  |    4/1/18 14:53
top      |       12         |   Henry      |   4/1/18 14:25  |    4/1/18 14:58

对于每个唯一的元组 (serial_number, date_2),我想保留 date_1 最小的行并保留每一列,以便最终我的数据集如下所示:

side     |  serial_number   |   inspector  |   date_1        |    date_2
bot      |       10         |   Jack       |   4/1/18 13:01  |    4/1/18 14:22
bot      |       11         |   Jack       |   4/1/18 14:01  |    4/1/18 14:53
top      |       12         |   Henry      |   4/1/18 14:25  |    4/1/18 14:58

为此,我当前的代码如下所示:

import pandas as pd

df = pd.read_csv("data.csv") #getting the data in a pandas dataframe
df_sorted = df.groupby(['serial_number','date_2'], sort=False)['date_1'].min()
df_sorted .to_csv("data_sorted.csv")

所以最后,我得到了正确的数据集,但我没有分组的列丢失了。这是生成的数据集:

 serial_number   |     date_1        |    date_2
      10         |     4/1/18 13:01  |    4/1/18 14:22
      11         |     4/1/18 14:01  |    4/1/18 14:53
      12         |     4/1/18 14:25  |    4/1/18 14:58

如何保留所有列? 谢谢。

【问题讨论】:

标签: python pandas


【解决方案1】:

我认为你想要的可以分两步实现

  1. 用最早到最新date_1对数据进行排序
  2. 针对唯一元组执行drop_duplicates

以下将是一种解决方案:

df = pd.read_csv("data.csv")
df_sorted = df.sort(['date_1'], ascending=True)
df_sorted.drop_duplicates(subset=['serial_number','date_2'], keep='first')

干杯!

【讨论】:

    【解决方案2】:

    在您的groupby 之后,不要调用min,它返回每个组的最小值,而是使用idxmin,它返回每个组中出现最小值的索引值:

    df.groupby(['serial_number','date_2'])['date_1'].idxmin()
    
    # serial_number  date_2             
    # 10             2018-04-01 14:22:00    1
    # 11             2018-04-01 14:53:00    2
    # 12             2018-04-01 14:58:00    4
    

    然后,您可以将这些索引与iloc 一起使用,以选择数据框中出现每个组的最小值的完整行:

    df.iloc[df.groupby(['serial_number','date_2'])['date_1'].idxmin()]
    
    #   side        serial_number inspector                    date_1  \
    # 1  bot                   10     Jack        2018-04-01 13:01:00   
    # 2  bot                   11     Jack        2018-04-01 14:01:00   
    # 4  top                   12     Henry       2018-04-01 14:25:00   
    # 
    #                date_2  
    # 1 2018-04-01 14:22:00  
    # 2 2018-04-01 14:53:00  
    # 4 2018-04-01 14:58:00  
    

    【讨论】:

    • 我选择你的解决方案。我必须先补充一点,我必须像这样解析 dateformat 中的日期(之前是一个字符串): dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M ') df = pd.read_csv("data.csv", parse_dates=['date_1'], date_parser=dateparse)
    猜你喜欢
    • 2021-05-14
    • 2014-06-17
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多