Pandas:如何在groupby中保留行值,其中列值为min

时间:2018-02-13 15:20:55

标签: python pandas

这是我的数据集样本

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

如何保留所有列? 谢谢。

2 个答案:

答案 0 :(得分:3)

而不是在min之后调用groupby,而是返回每个组的最小值,而是使用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  

答案 1 :(得分:2)

我认为你想要的只需两步即可实现

  1. 使用最早到最晚的date_1
  2. 对数据进行排序
  3. 针对唯一元组执行drop_duplicates
  4. 以下是一个解决方案:

    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')
    

    干杯!