Редактировать:ошибка новичка, которую я сделал в строке 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()' сбрасывает индекс, а два других - нет. Кроме этого, есть ли отличия?
святая мольба! ошибка новичка. Я создал данные в текстовой панели, скопировал и использовал pd.read_clipboard()
для быстрой загрузки в pandas. Я полностью пропустил, что он не превратился np.nan
в numpy NaN
Вот другое, вам нужно сделать 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
Спасибо за ответ. это ошибка новичка на np.nan, как я объяснил в комментарии к @coldspeed. Я проголосовал.
Основная проблема заключается в том, что у вас, вероятно, сохранена строка '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
/last
Это вернет первое/последнее ненулевое значение в каждой группе. Как ни странно не пропустит None
, хотя с кваргом это можно сделать 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)
/tail(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
это ошибка новичка на np.nan
, как я объяснил в комментарии к @coldspeed. Ваше объяснение превосходно. Спасибо. Я проголосовал и принял этот ответ
«np.nan» — это строка. Замените его фактической записью NaN. Вы увидите другие результаты с
first()
.