2017-06-04 81 views
2

我在Python中的熊貓數據框中有以下數據。我想根據名稱和屬性列對數據進行分組,並且只保留日期內的最低值。刪除基於多列的groupby只得到最低值的行

前:

Name Property       Date 
0 X1  Cash 621 days 00:00:00.000000000 
1 X1  Cash 256 days 00:00:00.000000000 
2 X1  Cash 101 days 00:00:00.000000000 
3 X1 Overflow 352 days 00:00:00.000000000 
4 X1 Overflow 101 days 00:00:00.000000000 
5 X1 Overflow 53 days 00:00:00.000000000 

重複的X2/X3等

後:

Name Property       Date 
2 X1  Cash 101 days 00:00:00.000000000 
5 X1 Overflow 53 days 00:00:00.000000000 

我試圖玩的語法,但無法得到它的權利:

df1 = df1[df1.groupby(['Name', 'Property'])['Date'].min()] 

回答

4

如果您致電在groupby.min()結果重置INTEX,你有你需要的輸出:

df.groupby(['Name', 'Property'])['Date'].min().reset_index() 
Out: 
    Name Property  Date 
0 X1  Cash 101 days 
1 X1 Overflow 53 days 

您還可以使用nsmallest

df.groupby(['Name', 'Property'])['Date'].nsmallest(1) 
Out: 
Name Property 
X1 Cash  2 101 days 
     Overflow 5 53 days 
Name: Date, dtype: timedelta64[ns] 

可以重置索引並刪除原始如果指數你想:

df.groupby(['Name', 'Property'])['Date'].nsmallest(1).reset_index(level=[0, 1]) 
Out: 
    Name Property  Date 
2 X1  Cash 101 days 
5 X1 Overflow 53 days 

如果你有更多的列你想保留,你有幾個選項。

df['additional column'] = np.arange(6) 

df 
Out: 
    Name Property  Date additional column 
0 X1  Cash 621 days     0 
1 X1  Cash 256 days     1 
2 X1  Cash 101 days     2 
3 X1 Overflow 352 days     3 
4 X1 Overflow 101 days     4 
5 X1 Overflow 53 days     5 

第一個,如@piRSquared所提到的,是使用與loc返回的行的索引:

df.loc[df.groupby(['Name', 'Property'])['Date'].idxmin()] 

中的第二個。將合併的原始數據幀和聚集的一個:

df.merge(df.groupby(['Name', 'Property'])['Date'].min().reset_index()) 

兩個產量:

Name Property  Date additional column 
0 X1  Cash 101 days     2 
1 X1 Overflow 53 days     5 

根據用例,可能會超越另一個。

+0

謝謝@ayhan! .min()上的重置索引完美工作。只是幾個後續問題: 1.當我執行df = df.groupby()....命令時,我還有一些其他列被刪除,我該如何保持這些列完好無損? 2.如何在下次需要發佈問題時正確地格式化我的代碼輸出? – rinwin

+0

@rinwin對於格式化,只需將DataFrame直接粘貼到問題框中,然後選擇它並單擊代碼按鈕(帶有「{}」圖標)。至於多列:你想每列的最小值,還是你想要最小的日期對應的行?對於第一個,刪除'['Date']'應該足夠了,但對於第二個可能需要合併。我會添加一個例子。 – ayhan

+0

df.loc [df.groupby(['Name','Property'])['Date']。idxmin()] – piRSquared

1

您可以嘗試transformpandas,它也不會刪除您的額外的列。

DF = df[df.groupby(['Property'])['Date'].transform(min) == df['Date']] 



    Name Property Date 

2 X1 Cash  101 days 

5 X1 Overflow 53 days