2016-09-19 85 views
1

我有一个列表,让我们说,看起来像这样(这我把成DF):熊猫:由列拖放准重复值

[ 
['john', '1', '1', '2016'], 
['john', '1', '10', '2016'], 
['sally', '3', '5', '2016'], 
['sally', '4', '1', '2016'] 
] 

columns['name', 'month', 'day', 'year']

我基本上只想输出一个新的DF,每个人只有最旧的行。所以它应该包含两行,一个在1/1/16的约翰和一个在3/5/16的萨利。

在DF的这种选择中,我一直都很难过,希望有人能提供一些关于如何完成上述的建议。

回答

4

您可以按year, month, day数据帧,然后采取的第一行从每个name

df.sort_values(by = ['year', 'month', 'day']).groupby('name').first() 

# month day year 
# name   
# john 1 1 2016 
#sally 3 5 2016 

数据

df = pd.DataFrame([['john', '1', '1', '2016'], 
        ['john', '1', '10', '2016'], 
        ['sally', '3', '5', '2016'], 
        ['sally', '4', '1', '2016']], 
        columns = ['name', 'month', 'day', 'year']) 
0

选项1个
使用pd.to_datetime解析['年','月','日' ] 列。
groupby('name')然后采取first

df['date'] = pd.to_datetime(df[['year', 'month', 'day']]) 
df.sort_values(['name', 'date']).groupby('name').first() 

enter image description here

选项2
相同pd.to_datetime用法。
groupby('name')idxmin查找最小日期。

df['date'] = pd.to_datetime(df[['year', 'month', 'day']]) 
df.ix[df.groupby('name').date.idxmin()] 

enter image description here

+0

排序由'name'是没有必要的,是吗? –

+0

不,不过,如果我要查看一个intermdeiate的结果,我想保留名字。虽然没有必要。 – piRSquared