2016-05-04 222 views
0

我有一個表,看起來像這樣每個組中唯一進入前值:獲得具有相同的列值

Column 1 | Column 2 | Column 3 
    1   a   100 
    1   r   100 
    1   h   200 
    1   j   200 
    2   a   50 
    2   q   50 
    2   k   40 
    3   a   10 
    3   q   150 
    3   k   150 

想象我試圖讓每個GROUPBY的頂部值(「列1」 )

通常情況下,我只想。頭(N),但在這種情況下,我也試圖讓與像同一列3只值前幾列:

Column 1 | Column 2 | Column 3 
    1   a   100 
    1   r   100 
    2   a   50 
    2   q   50 
    3   a   10 

假設表已在訂單我想要

任何建議,將不勝感激

回答

1

我想你需要首先需要groupbyfirst然後merge

print df.groupby('Column 1')['Column 3'].first().reset_index() 
    Column 1 Column 3 
0   1  100 
1   2  50 
2   3  10 

print pd.merge(df, 
       df.groupby('Column 1')['Column 3'].first().reset_index(), 
       on=['Column 1','Column 3']) 

    Column 1 Column 2 Column 3 
0   1  a  100 
1   1  r  100 
2   2  a  50 
3   2  q  50 
4   3  a  10 

時序

df = pd.concat([df]*1000).reset_index(drop=True) 

%timeit pd.merge(df, df.groupby('Column 1')['Column 3'].first().reset_index(), on=['Column 1','Column 3']) 
100 loops, best of 3: 3.58 ms per loop 

%timeit df[(df.assign(diff=df.groupby('Column 1')['Column 3'].diff().fillna(0)).groupby('Column 1')['diff'].cumsum() == 0)] 
100 loops, best of 3: 5.06 ms per loop 
+0

嗨,這給了我子集列3的重複值,但是我需要對應於列3中第一個值的每個列1組的頂部行。因此在您的示例中它將是:列3:組1 bb組2年dd –

0

我的解決方案(不合並):

In [83]: idx = (df.assign(diff=df.groupby('Column1')['Column3'].diff().fillna(0)) 
    ....:   .groupby('Column1')['diff'].cumsum() == 0 
    ....:  ) 

In [84]: df[idx] 
Out[84]: 
    Column1 Column2 Column3 
0  1  a  100 
1  1  r  100 
4  2  a  50 
5  2  q  50 
7  3  a  10 

說明:

In [85]: df.assign(diff=df.groupby('Column1')['Column3'].diff().fillna(0)) 
Out[85]: 
    Column1 Column2 Column3 diff 
0  1  a  100 0.0 
1  1  r  100 0.0 
2  1  h  200 100.0 
3  1  j  200 0.0 
4  2  a  50 0.0 
5  2  q  50 0.0 
6  2  k  40 -10.0 
7  3  a  10 0.0 
8  3  q  150 140.0 
9  3  k  150 0.0 

In [86]: df.assign(diff=df.groupby('Column1')['Column3'].diff().fillna(0)).groupby('Column1')['diff'].cumsum() 
Out[86]: 
0  0.0 
1  0.0 
2 100.0 
3 100.0 
4  0.0 
5  0.0 
6 -10.0 
7  0.0 
8 140.0 
9 140.0 
Name: diff, dtype: float64 
+0

這是假設我總是隻需要前兩名每組但我期待在獲得對應於第3欄的頂部值爲每個組 –

+0

@EduardKim所有行,你能否發佈另一個樣本數據集,因爲它不太清楚? – MaxU

相關問題