Основная проблема заключается в том, что вы, вероятно, храните строку '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