熊猫数据框的复杂子集

时间:2018-10-18 22:04:02

标签: python pandas dataframe

我有一个数据框,其中一列中有多个值。我要确保对于数据框中的每个唯一列元素,我都有3个最新条目。

我有:

      Group      Date        Value
        A        10/1/2017    4.4
        A        8/3/2017     9.2
        A        5/3/2017     8.4
        A        4/4/2017     4.4
        B        12/1/2015    4.4
        B        8/3/2015     9.2
        B        5/4/2015     8.4
        B        4/5/2015     4.4

我想要:

      Group      Date        Value
        A        10/1/2017    4.4
        A        8/3/2017     9.2
        A        5/3/2017     8.4
        B        12/1/2015    4.4
        B        8/3/2015     9.2
        B        5/4/2015     8.4

日期是日期时间。在这篇文章中,我不知道该如何表示。

我可以使用以下代码来获取它:

new_df = pd.DataFrame()
for group in df['Group'].unique():

    temp_df = df[df['Group'] == group]
    temp_df = temp_df[0:3]

    if new_df.empty:

       new_df = temp_df

    else:

       new_df.append(temp_df)

还有更多的pythonic方法可以做到这一点吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

以下内容如何:

df.sort_values(by='Date', ascending=False).groupby('Group').head(3)

在我的小测试数据集上,它返回以下内容(我使用head(2)):

    Group   Date
1   c   2050-01-01
8   a   2032-02-03
0   a   2030-01-01
9   c   2029-01-01
10  b   2018-01-01
2   b   2017-02-03

并且您可以看到各个组的值不再很好地组合在一起。我们可以通过首先在“组”上然后在“日期”上排序来解决此问题:

df.sort_values(by=['Group', 'Date'], ascending=[True,False]).groupby('Group').head(3)


    Group   Date
8   a   2032-02-03
0   a   2030-01-01
10  b   2018-01-01
2   b   2017-02-03
1   c   2050-01-01
9   c   2029-01-01

答案 1 :(得分:2)

您可以将groupbynlargest一起使用:

df.groupby(['Group'])['Date','Value'].apply(lambda x: x.nlargest(3,'Date'))


          Date      Value
Group           
A   0   2017-10-01  4.4
    1   2017-08-03  9.2
    2   2017-05-03  8.4
B   4   2015-12-01  4.4
    5   2015-08-03  9.2
    6   2015-05-04  8.4