В чем разница между groupby.first, groupby.nth, groupby.head, когда as_index=False

Редактировать:ошибка новичка, которую я сделал в строке 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()' сбрасывает индекс, а два других - нет. Кроме этого, есть ли отличия?

«np.nan» — это строка. Замените его фактической записью NaN. Вы увидите другие результаты с first().

cs95 09.04.2019 02:01

святая мольба! ошибка новичка. Я создал данные в текстовой панели, скопировал и использовал pd.read_clipboard() для быстрой загрузки в pandas. Я полностью пропустил, что он не превратился np.nan в numpy NaN

Andy L. 09.04.2019 02:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
2 575
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот другое, вам нужно сделать 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. Я проголосовал.

Andy L. 09.04.2019 02:34
Ответ принят как подходящий

Основная проблема заключается в том, что у вас, вероятно, сохранена строка '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. Ваше объяснение превосходно. Спасибо. Я проголосовал и принял этот ответ

Andy L. 09.04.2019 02:30

Другие вопросы по теме

Повторяющаяся ошибка HTTP 413 при очистке нескольких страниц
Умножение определенных ячеек, перечисленных по индексу строки в столбце фрейма данных, на константу
Как правильно идентифицировать значения с плавающей запятой [0, 1], содержащие точку, в типе объекта DataFrame?
Пытаюсь получить расстояние, используя долготу и широту, но продолжаю работать с ошибкой: объект «Серия» не имеет атрибута «радианы»
Найдите процент от общего количества категорий, отсортируйте от самой высокой до самой низкой, сохраните имена первых 80% и переименуйте все остальные в «другие»
Изменить значение элемента с учетом флага
Добавление наблюдений с одинаковым столбцом и создание одной уникальной строки для каждого наблюдения
Как масштабировать массив numpy от 0 до 1 с перерегулированием?
Сравнение сжатого распределения по когортам
Импорт нескольких файлов Excel в несколько pd.Series