Панды dataframe получить первую строку каждой группы
у меня есть панды DataFrame
как следующим.
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"]})
Я хочу сгруппировать это по ["id", "value"] и получить первую строку каждой группы.
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
ожидаемый результат
id value
1 first
2 first
3 first
4 second
5 first
6 first
7 fourth
Я попытался следовать, который дает только первую строку DataFrame
. Любая помощь в этом отношении приветствуется.
In [25]: for index, row in df.iterrows():
....: df2 = pd.DataFrame(df.groupby(['id','value']).reset_index().ix[0])
4 ответа:
>>> df.groupby('id').first() value id 1 first 2 first 3 first 4 second 5 first 6 first 7 fourth
Если вам нужно
id
в графе:>>> 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 первых записей, вы можете использовать head ():
>>> 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
Это даст вам вторую строку каждой группы (нуль индексируется, nth(0) совпадает с первым ()):
df.groupby('id').nth(1)
документация: http://pandas.pydata.org/pandas-docs/stable/groupby.html#taking-the-nth-row-of-each-group
Я бы предложил использовать
.nth(0)
, а не.first()
Если вам нужно получить первую строку.разница между ними заключается в том, как они обрабатывают NaNs, так что
.nth(0)
вернет первую строку группы независимо от того, какие значения в этой строке, в то время как.first()
в конечном итоге вернуть первый неNaN
значение в каждом столбце.например, если ваш набор данных:
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
и
>>> df.groupby('id').first() value id 1 first 2 second 3 first 4 first
может быть, это то, что вы хотите
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