这是我的数据集样本
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
如何保留所有列? 谢谢。
答案 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)
我认为你想要的只需两步即可实现
date_1
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')
干杯!