Pandalar veri çerçevesi her grubun ilk satırını alır


137

Benim DataFramegibi pandalarım var .

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4,5,6,6,6,7,7],
                'value'  : ["first","second","second","first",
                            "second","first","third","fourth",
                            "fifth","second","fifth","first",
                            "first","second","third","fourth","fifth"]})

Bunu ["id", "değer"] ile gruplamak ve her grubun ilk satırını almak istiyorum.

        id   value
0        1   first
1        1  second
2        1  second
3        2   first
4        2  second
5        3   first
6        3   third
7        3  fourth
8        3   fifth
9        4  second
10       4   fifth
11       5   first
12       6   first
13       6  second
14       6   third
15       7  fourth
16       7   fifth

Beklenen sonuç

    id   value
     1   first
     2   first
     3   first
     4  second
     5  first
     6  first
     7  fourth

Aşağıdakileri denedim ki bu sadece DataFrame. Bununla ilgili herhangi bir yardım takdir edilmektedir.

In [25]: for index, row in df.iterrows():
   ....:     df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])

2
Bu sorunun oldukça eski olduğunun farkındayım, ancak cevabı @vital_dml ile kabul etmenizi öneririm çünkü nans first()ile ilgili davranış çok şaşırtıcı ve çoğu insanın beklemeyeceğini düşündüğüm bir şey.
user545424

Yanıtlar:


238
>>> df.groupby('id').first()
     value
id        
1    first
2    first
3    first
4   second
5    first
6    first
7   fourth

idSütun olarak ihtiyacınız varsa :

>>> df.groupby('id').first().reset_index()
   id   value
0   1   first
1   2   first
2   3   first
3   4  second
4   5   first
5   6   first
6   7  fourth

N tane ilk kaydı almak için head () kullanabilirsiniz:

>>> df.groupby('id').head(2).reset_index(drop=True)
    id   value
0    1   first
1    1  second
2    2   first
3    2  second
4    3   first
5    3   third
6    4  second
7    4   fifth
8    5   first
9    6   first
10   6  second
11   7  fourth
12   7   fifth

1
Çok teşekkürler! İyi çalıştı :) İkinci sırayı aynı şekilde almak mümkün değil değil mi? Bunu da açıklayabilir misin?
Nilani Algiriyage

g = df.groupby (['oturum']) g.agg (lambda x: x.iloc [0]) bu da çalışıyor, ikinci değeri alma fikriniz yok mu? :(
Nilani Algiriyage

üstten itibaren saymanın top_n satır numarasını, ardından dx = df.groupby ('id']. head (top_n) .reset_index (drop = True) almak istediğinizi varsayalım ve en alttan saymanın satır numarasını almak istediğinizi varsayalım bottom_n, ardından dx = df.groupby ('id']. tail (bottom_n) .reset_index (drop = True)
Quetzalcoatl

3
Son n satırı istiyorsanız, tail(n)(varsayılan n = 5) ( ref. ) Kullanın . Kafam karışmasın last(), o hatayı ben yaptım.
rocarvaj

groupby('id',as_index=False)ayrıca idsütun olarak tutar
Richard DiSalvo

50

Bu size her grubun ikinci satırını verecektir (sıfır indisli, nth (0), birinci () ile aynıdır):

df.groupby('id').nth(1) 

Belgeler: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group


8
Örneğin ilk üç gibi katlar istiyorsanız, nth((0,1,2))veya gibi bir dizi kullanın nth(range(3)).
Ronan Paixão

@ RonanPaixão: Her nasılsa menzil verdiğimde hata veriyor:TypeError: n needs to be an int or a list/set/tuple of ints
Peaceful

@Peaceful: Python 3 mü kullanıyorsunuz? Öyleyse, range(3)siz yazmadıkça bir liste döndürmez list(range(3)).
Ben

41

Ben kullanmayı öneririm .nth(0)ziyade .first()İlk satırı almak gerekiyorsa.

Aralarındaki fark, NaN'leri nasıl ele aldıklarıdır, bu nedenle .nth(0), bu satırdaki değerler ne olursa olsun, grubun ilk satırını .first()döndürecek ve sonunda her sütundaki ilk not NaN değerini döndürecektir .

Örneğin, veri kümeniz:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,4,4],
            'value'  : ["first","second","third", np.NaN,
                        "second","first","second","third",
                        "fourth","first","second"]})

>>> df.groupby('id').nth(0)
    value
id        
1    first
2    NaN
3    first
4    first

Ve

>>> df.groupby('id').first()
    value
id        
1    first
2    second
3    first
4    first

1
iyi bir nokta. dizin dışında .head(1)da öyle davranıyor gibi görünüyor.nth(0)
Richard DiSalvo

1
Diğer bir fark, nth (0) orijinal indeksi koruyacak (eğer as_index = False), ilk () ise korumayacak. Bir zamanlar bu benim için önemli bir farktı, çünkü indeksin kendisine ihtiyacım vardı.
Oleg O

7

belki istediğin budur

import pandas as pd
idx = pd.MultiIndex.from_product([['state1','state2'],   ['county1','county2','county3','county4']])
df = pd.DataFrame({'pop': [12,15,65,42,78,67,55,31]}, index=idx)
                pop
state1 county1   12
       county2   15
       county3   65
       county4   42
state2 county1   78
       county2   67
       county3   55
       county4   31
df.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values('pop', ascending=False)).groupby(level=0).head(3)

> Out[29]: 
                pop
state1 county3   65
       county4   42
       county2   15
state2 county1   78
       county2   67
       county3   55

7

Her gruptan sadece ilk satıra ihtiyacınız varsa drop_duplicates, işlevin varsayılan yöntemine dikkat edin keep='first'.

df.drop_duplicates('id')
Out[1027]: 
    id   value
0    1   first
3    2   first
5    3   first
9    4  second
11   5   first
12   6   first
15   7  fourth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.