что отличается между groupby.first, groupby.nth, groupby.head, когда as_index = False - PullRequest
1 голос
/ 09 апреля 2019

Редактировать: ошибка новичка, которую я допустил в строке np.nan, указав @coldspeed, @ wen-ben, @ALollz. Ответы довольно хорошие, поэтому я не удаляю этот вопрос, чтобы сохранить эти ответы.

Оригинал:
Я прочитал этот вопрос / ответ В чем разница между groupby.first () и groupby.head (1)?

Этот ответ объяснил, что различия в обработке NaN значения. Однако, когда я звоню groupby с as_index=False, они оба выбирают NaN в порядке.

Кроме того, Pandas имеет groupby.nth с функциональностью, аналогичной head, и first

В чем разница groupby.first(), groupby.nth(0), groupby.head(1) с as_index=False?

Пример ниже:

In [448]: df
Out[448]:
   A       B
0  1  np.nan
1  1       4
2  1      14
3  2       8
4  2      19
5  2      12

In [449]: df.groupby('A', as_index=False).head(1)
Out[449]:
   A       B
0  1  np.nan
3  2       8

In [450]: df.groupby('A', as_index=False).first()
Out[450]:
   A       B
0  1  np.nan
1  2       8

In [451]: df.groupby('A', as_index=False).nth(0)
Out[451]:
   A       B
0  1  np.nan
3  2       8

Я видел, что "firs ()" сбрасывает индекс, а остальные 2 - нет. Кроме этого, есть ли различия?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Основная проблема заключается в том, что вы, вероятно, храните строку 'np.nan', а не реальное нулевое значение. Вот как по-разному обрабатываются три значения null:

Пример данных:

import pandas as pd
df = pd.DataFrame({'A': [1,1,2,2,3,3], 'B': [None, '1', np.NaN, '2', 3, 4]})

first

Это вернет первое ненулевое значение в каждой группе. Как ни странно, он не пропустит None, хотя это можно сделать с помощью kwarg dropna=True. В результате, вы можете вернуть значения для столбцов, которые изначально были частью разных строк :

df.groupby('A', as_index=False).first()
#   A     B
#0  1  None
#1  2     2
#2  3     3

df.groupby('A', as_index=False).first(dropna=True)
#   A  B
#0  1  1
#1  2  2
#2  3  3

head(n)

Возвращает первые n строк в группе. Значения остаются связанными в строках . Если вы дадите ему n, превышающему количество строк, он вернет все строки в этой группе без жалоб:

df.groupby('A', as_index=False).head(1)
#   A     B
#0  1  None
#2  2   NaN
#4  3     3

df.groupby('A', as_index=False).head(200)
#   A     B
#0  1  None
#1  1     1
#2  2   NaN
#3  2     2
#4  3     3
#5  3     4

nth

Это занимает строку nth, поэтому значения остаются связанными внутри строки . .nth(0) совпадает с .head(1), хотя они используются по-разному. Например, если вам нужен 0-й и 2-й ряд, это трудно сделать с .head(), но легко с .nth([0,2]). Также проще написать .head(10), чем .nth(list(range(10)))).

df.groupby('A', as_index=False).nth(0)
#   A     B
#0  1  None
#2  2   NaN
#4  3     3

nth также поддерживает удаление строк с любыми нулевыми значениями, поэтому вы можете использовать его для возврата первой строки без каких-либо нулевых значений, в отличие от .head()

df.groupby('A', as_index=False).nth(0, dropna='any')
#   A  B
#A      
#1  1  1
#2  2  2
#3  3  3
2 голосов
/ 09 апреля 2019

Здесь другое, вам нужно сделать np.nan в NaN, в вашем оригинальном df это string, после конвертации вы увидите другое

df=df.mask(df=='np.nan')
df.groupby('A', as_index=False).head(1) #df.groupby('A', as_index=False).nth(0)

Out[8]: 
   A    B
0  1  NaN
3  2    8
df.groupby('A', as_index=False).first() 
# the reason why first have the index reset, 
#since it will have chance select the value from different row within the group, 
#when the first item is NaN it will skip it to find the first not null value 
#rather than from the same row, 
#If still keep the original row index will be misleading. 
Out[9]: 
   A  B
0  1  4
1  2  8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...