Как мне получить количество строк в Pandas DataFrame?

avatar
yemu
11 апреля 2013 в 08:14
2887574
16
1416

Я пытаюсь получить количество строк df фрейма данных с помощью Pandas, и вот мой код.

Метод 1:

total_rows = df.count
print total_rows + 1

Метод 2:

total_rows = df['First_columnn_label'].count
print total_rows + 1

Оба фрагмента кода дают мне эту ошибку:

TypeError: неподдерживаемые типы операндов для +: 'instancemethod' и 'int'

Что я делаю не так?

Источник
yemu
11 апреля 2013 в 08:15
17

хорошо, я узнал, я должен был вызвать метод, а не свойство проверки, поэтому он должен быть df.count () no df.count

smci
18 апреля 2014 в 12:04
80

^ Опасно! Помните, что df.count() вернет только количество строк, отличных от NA / NaN, для каждого столбца. Вместо этого вы должны использовать df.shape[0], который всегда будет правильно указывать количество строк.

Marcelo Bielsa
1 сентября 2015 в 03:32
4

Обратите внимание, что df.count не вернет int, если фрейм данных пуст (например, pd.DataFrame (columns = ["Blue", "Red"). Count не равно 0).

Ответы (16)

avatar
root
11 апреля 2013 в 08:24
2045

Для кадра данных df можно использовать любое из следующего:

Performance plot


Код для воспроизведения сюжета:

import numpy as np
import pandas as pd
import perfplot

perfplot.save(
    "out.png",
    setup=lambda n: pd.DataFrame(np.arange(n * 3).reshape(n, 3)),
    n_range=[2**k for k in range(25)],
    kernels=[
        lambda df: len(df.index),
        lambda df: df.shape[0],
        lambda df: df[df.columns[0]].count(),
    ],
    labels=["len(df.index)", "df.shape[0]", "df[df.columns[0]].count()"],
    xlabel="Number of rows",
)
K.-Michael Aye
25 февраля 2014 в 04:51
19

Есть одна веская причина, по которой использовать shape в интерактивной работе вместо len (df): пробуя различные фильтры, мне часто нужно знать, сколько элементов осталось. Что касается формы, я могу это увидеть, просто добавив .shape после фильтрации. С помощью len () редактирование командной строки становится гораздо более громоздким, если идти вперед и назад.

jtschoonhoven
16 марта 2016 в 21:26
11

Не будет работать для OP, но если вам просто нужно знать, пуст ли фрейм данных, df.empty - лучший вариант.

T.G.
22 мая 2017 в 18:34
21

Я знаю, что это было давно, но не len (df.index) занимает 381 наносекунду или 0,381 микросекунду, df.shape в 3 раза медленнее, занимая 1,17 микросекунды. я что-то пропустил? @корень

user1761806
25 июня 2017 в 15:20
0

По результатам моего тестирования df.shape [0] и len (df.index) дали одинаковую производительность. df.shape был немного быстрее.

xaedes
15 августа 2017 в 16:42
12

Матрица (3,3) - плохой пример, поскольку она не показывает порядок кортежа формы

smci
16 февраля 2018 в 01:24
0

Не забудьте ответить на актуальный вопрос; ответ: df.shape[0], а не df.shape, который дает кортеж, и, как сказал xaedes, лучше всего выбрать пример, где nrows! = ncols

itsjef
24 марта 2018 в 03:19
7

Как df.shape[0] быстрее, чем len(df) или len(df.columns)? Поскольку 1 нс (наносекунда) = 1000 мкс (микросекунда), следовательно, 1,17 мкс = 1170 нс, что означает примерно в 3 раза медленнее, чем 381 нс.

jared
24 апреля 2018 в 19:23
3

@itsjef У вас обратное преобразование: 1 мкс = 1000 нс . Но ваша точка зрения верна, len(df.index) на самом деле быстрее.

halloleo
18 сентября 2018 в 05:31
2

Обновленный ответ, чтобы отразить тот факт, что len(df.index) - самый быстрый метод.

Decula
22 января 2019 в 18:59
1

похоже, что len (df) самый быстрый.

NoName
3 февраля 2020 в 23:06
0

А в чем разница между len(df) и len(df.index)? Зачем вводить extra для df.index?

jorijnsmit
24 февраля 2020 в 15:08
0

Подозреваемый pandas.Index.size на самом деле будет быстрее, чем len(df.index), но timeit на моем компьютере говорит об обратном (на ~ 150 нс медленнее на цикл).

jorijnsmit
24 февраля 2020 в 15:11
0

Для записи: len(df) медленнее, чем len(df.index) (@Decula, @NoName).

xuancong84
15 июля 2020 в 05:14
4

Я тестировал на Python3, @halloleo прав, len (df.index) примерно в два раза быстрее, чем df.shape [0]. С другой стороны, len (df) иногда возвращает количество столбцов, а не строк, в зависимости от текущего внутреннего формата фрейма данных.

Peter Mortensen
8 февраля 2021 в 15:02
0

Какой комментарий? Только у Дэна Аллена (в настоящее время) есть ответ.

Karol Zlot
6 октября 2021 в 06:36
0

@MateenUlhaq Можете ли вы объяснить, что означает «самое медленное, но избегающее подсчета значений NaN в первом столбце» из вашего редактирования? Было бы полезно также включить в ответ, когда можно ожидать различий по сравнению с другими методами (с примером).

Mateen Ulhaq
6 октября 2021 в 23:55
1

@KarolZlot Улучшена формулировка. df[df.columns[0]] возвращает 0-й столбец. .count() измеряет количество значений, отличных от NaN, в данном столбце. Обычно я использую первые два метода, а третий полезен только в редких случаях.

avatar
Amandeep Singh
7 июля 2021 в 06:00
-2
# this will give you the number of rows in the dataframe df
df.shape[0]
He3lixxx
7 июля 2021 в 21:55
0

Использование df.shape[0] было одним из возможных решений, обсуждаемых в принятом ответе от 2013 года.

avatar
SamithaP
2 января 2021 в 23:04
-1

Подумайте, набор данных - это «данные» и назовите свой набор данных как «data_fr», а количество строк в data_fr - «nu_rows»

#import the data frame. Extention could be different as csv,xlsx or etc.
data_fr = pd.read_csv('data.csv')

#print the number of rows
nu_rows = data_fr.shape[0]
print(nu_rows)
avatar
Saurav
12 мая 2020 в 07:14
7

Вы также можете сделать это:

Допустим, df - ваш фрейм данных. Затем df.shape дает вам форму вашего фрейма данных, то есть (row,col)

Таким образом, назначьте команду ниже, чтобы получить требуемый

 row = df.shape[0], col = df.shape[1]
Nerxis
17 мая 2021 в 08:46
0

Или вы можете напрямую использовать row, col = df.shape вместо этого, если вам нужно получить и то, и другое одновременно (это короче, и вам не нужно заботиться об индексах).

avatar
Kiprono Elijah Koech
24 апреля 2020 в 16:30
3

Любой из них может это сделать (df - имя DataFrame):

Метод 1 : Использование функции len:

len(df) даст количество строк в DataFrame с именем df.

Метод 2 : использование функции count:

df[col].count() подсчитает количество строк в данном столбце col.

df.count() даст количество строк для всех столбцов.

John
24 апреля 2020 в 18:07
4

Это хороший ответ, но на этот вопрос уже достаточно ответов, так что это ничего особо не добавляет.

avatar
Abhiraam Eranti
5 апреля 2020 в 19:49
0

Я не уверен, что это сработает (данные можно было бы опустить), но это может сработать:

*dataframe name*.tails(1)

, а затем используя это, вы можете узнать количество строк, запустив фрагмент кода и посмотрев на номер строки, который вам был предоставлен.

avatar
jorijnsmit
24 февраля 2020 в 15:14
0

Альтернативный метод определения количества строк в фрейме данных, который я считаю наиболее читаемым, - это pandas.Index.size.

Обратите внимание, что, поскольку я прокомментировал принятый ответ,

Подозреваемый pandas.Index.size на самом деле будет быстрее, чем len(df.index), но timeit на моем компьютере говорит об обратном (на ~ 150 нс медленнее на цикл).

avatar
cs95
30 марта 2019 в 19:55
122

Как мне получить количество строк в фрейме данных Pandas?

В этой таблице приведены различные ситуации, в которых вы хотите подсчитать что-либо в DataFrame (или Series, для полноты), а также рекомендуемый метод (ы).

Enter image description here

Сноски

  1. DataFrame.count возвращает количество для каждого столбца в виде Series, поскольку ненулевое количество зависит от столбца.
  2. DataFrameGroupBy.size возвращает Series, поскольку все столбцы в одной группе имеют одинаковое количество строк.
  3. DataFrameGroupBy.count возвращает DataFrame, поскольку ненулевое количество может отличаться в столбцах одной группы. Чтобы получить ненулевой подсчет по группе для определенного столбца, используйте df.groupby(...)['x'].count(), где «x» - столбец для подсчета.

# Примеры минимального кода

Ниже я показываю примеры каждого из методов, описанных в таблице выше. Во-первых, настройка -

df = pd.DataFrame({
    'A': list('aabbc'), 'B': ['x', 'x', np.nan, 'x', np.nan]})
s = df['B'].copy()

df

   A    B
0  a    x
1  a    x
2  b  NaN
3  b    x
4  c  NaN

s

0      x
1      x
2    NaN
3      x
4    NaN
Name: B, dtype: object

Количество строк в DataFrame: len(df), df.shape[0] или len(df.index)

len(df)
# 5

df.shape[0]
# 5

len(df.index)
# 5

Кажется глупым сравнивать производительность операций с постоянным временем, особенно когда разница находится на уровне «серьезно, не беспокойтесь об этом». Но, похоже, это тенденция с другими ответами, поэтому я делаю то же самое для полноты.

Из трех вышеперечисленных методов len(df.index) (как упоминалось в других ответах) является самым быстрым.

Примечание

  • Все вышеперечисленные методы представляют собой операции с постоянным временем, поскольку они представляют собой простой поиск атрибутов.
  • df.shape (аналогично ndarray.shape) - это атрибут, который возвращает кортеж (# Rows, # Cols). Например, df.shape возвращает (8, 2) для примера здесь.

Количество столбцов в DataFrame: df.shape[1], len(df.columns)

df.shape[1]
# 2

len(df.columns)
# 2

Аналогично len(df.index), len(df.columns) является более быстрым из двух методов (но требует больше символов для ввода).

Количество строк в серии: len(s), s.size, len(s.index)

len(s)
# 5

s.size
# 5

len(s.index)
# 5

s.size и len(s.index) примерно одинаковы по скорости. Но я рекомендую len(df).

Примечание size - это атрибут, который возвращает количество элементов (= count строк для любой серии). DataFrames также определяют атрибут размера, который возвращает тот же результат, что и df.shape[0] * df.shape[1].

Количество ненулевых строк: DataFrame.count и Series.count

Описанные здесь методы подсчитывают только ненулевые значения (т.е. NaN игнорируются).

Вызов DataFrame.count вернет не-NaN счетчики для в каждом столбце :

df.count()

A    5
B    3
dtype: int64

Для серии используйте Series.count с аналогичным эффектом:

s.count()
# 3

Групповое количество строк: GroupBy.size

Для DataFrames используйте DataFrameGroupBy.size для подсчета количества строк в группе.

df.groupby('A').size()

A
a    2
b    2
c    1
dtype: int64

Аналогично, для Series вы будете использовать SeriesGroupBy.size.

s.groupby(df.A).size()

A
a    2
b    2
c    1
Name: B, dtype: int64

В обоих случаях возвращается Series. Это имеет смысл и для DataFrames, поскольку все группы имеют одинаковое количество строк.

Групповое количество ненулевых строк: GroupBy.count

Аналогично предыдущему, но используйте GroupBy.count, а не GroupBy.size. Обратите внимание, что size всегда возвращает Series, а count возвращает Series, если вызывается для определенного столбца, или DataFrame.

Следующие методы возвращают то же самое:

df.groupby('A')['B'].size()
df.groupby('A').size()

A
a    2
b    2
c    1
Name: B, dtype: int64

Между тем для count у нас есть

df.groupby('A').count()

   B
A
a  2
b  1
c  0

... вызывается для всего объекта GroupBy, а не

df.groupby('A')['B'].count()

A
a    2
b    1
c    0
Name: B, dtype: int64

Вызывается в определенном столбце.

avatar
Allen
22 февраля 2018 в 02:58
6

Если вы хотите получить количество строк в середине связанной операции, вы можете использовать:

df.pipe(len)

Пример:

row_count = (
      pd.DataFrame(np.random.rand(3,4))
      .reset_index()
      .pipe(len)
)

Это может быть полезно, если вы не хотите помещать длинный оператор внутри функции len().

Вы можете использовать вместо него __len__(), но __len__() выглядит немного странно.

cs95
30 марта 2019 в 20:15
0

Кажется бессмысленным хотеть «перенаправить» эту операцию, потому что нет ничего другого, куда вы можете передать это (оно возвращает целое число). Я бы предпочел count = len(df.reset_index()), чем count = df.reset_index().pipe(len). Первый - это просто поиск атрибутов без вызова функции.

avatar
debo
7 декабря 2017 в 23:37
12

... основываясь на ответе Яна-Филипа Герке.

Причина, по которой len(df) или len(df.index) быстрее, чем df.shape[0]:

Посмотрите на код. df.shape - это @property, который запускает метод DataFrame, вызывающий len дважды.

df.shape??
Type:        property
String form: <property object at 0x1127b33c0>
Source:
# df.shape.fget
@property
def shape(self):
    """
    Return a tuple representing the dimensionality of the DataFrame.
    """
    return len(self.index), len(self.columns)

И под капюшоном линзы (df)

df.__len__??
Signature: df.__len__()
Source:
    def __len__(self):
        """Returns length of info axis, but here we use the index """
        return len(self.index)
File:      ~/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py
Type:      instancemethod

len(df.index) будет немного быстрее, чем len(df), поскольку у него на один вызов функции меньше, но это всегда быстрее, чем df.shape[0]

Peter Mortensen
8 февраля 2021 в 15:22
0

Подсветка синтаксиса кажется не совсем правильной. Ты можешь починить это? Например. это смесь вывода, кода и аннотации (не риторический вопрос)?

debo
8 апреля 2021 в 04:04
0

@PeterMortensen Этот вывод взят из ipython / jupyter. Выполнение имени функции с двумя вопросительными знаками и без круглых скобок покажет определение функции. т.е. для функции len() вы должны выполнить len??

avatar
Vlad
21 сентября 2017 в 01:59
3

Для кадра данных df, количество строк в формате напечатанной запятой, используемое при исследовании данных:

def nrow(df):
    print("{:,}".format(df.shape[0]))

Пример:

nrow(my_df)
12,456,789
avatar
Catbuilts
29 сентября 2016 в 07:41
8

Я прихожу в Pandas из фона R и вижу, что Pandas более сложен, когда дело доходит до выбора строк или столбцов.

Некоторое время мне приходилось бороться с этим, а потом я нашел несколько способов справиться с этим:

Получение количества столбцов:

len(df.columns)
## Here:
# df is your data.frame
# df.columns returns a string. It contains column's titles of the df.
# Then, "len()" gets the length of it.

Получение количества строк:

len(df.index) # It's similar.
Catbuilts
29 октября 2018 в 10:16
0

После использования Pandas в течение некоторого времени, я думаю, нам следует использовать df.shape. Он возвращает количество строк и столбцов соответственно.

avatar
Memin
25 июня 2016 в 05:23
58

TL; DR использовать len(df)

len() позволяет получить количество элементов в списке. Итак, для получения количества строк в DataFrame просто используйте len(df).

Кроме того, вы можете получить доступ ко всем строкам и всем столбцам с помощью df.index и df.columns соответственно. Поскольку вы можете использовать len(anyList) для получения номеров элементов, используйте len(df.index) даст вам количество строк, а len(df.columns) даст количество столбцов.

Или вы можете использовать df.shape, который возвращает количество строк и столбцов вместе (в виде кортежа). Если вы хотите получить доступ к количеству строк, используйте только df.shape[0]. Для количества столбцов используйте только: df.shape[1].

Memin
22 сентября 2021 в 19:19
1

@BrendanMetcalfe, я не знаю, что может быть не так с вашим фреймворком, не видя его данных. Вы можете проверить конец небольшого скрипта до конца, чтобы увидеть, действительно, len хорошо работает для получения количества строк. Вот сценарий onecompiler.com/python/3xc9nuvrx

Brendan Metcalfe
22 сентября 2021 в 21:56
0

Я понял это спасибо

Memin
22 сентября 2021 в 22:02
1

@BrendanMetcalfe без проблем. И вы можете проголосовать, если это помогло ...

avatar
Nasir Shah
20 февраля 2016 в 13:30
409

Предположим, df - ваш фрейм данных, тогда:

count_row = df.shape[0]  # Gives number of rows
count_col = df.shape[1]  # Gives number of columns

Или, точнее,

r, c = df.shape
Sumit Pokhrel
2 января 2020 в 14:47
13

Если набор данных большой, len (df.index) значительно быстрее, чем df.shape [0], если вам нужно только количество строк. Я это тестировал.

Ardalan Shahgholi
6 октября 2020 в 20:00
1

Почему у меня нет метода формы в моем DataFrame?

Connor
1 августа 2021 в 23:54
1

@ArdalanShahgholi, вероятно, потому, что то, что было возвращено, является серией, которая всегда одномерная. Следовательно, будет работать только len(df.index).

Ardalan Shahgholi
17 августа 2021 в 18:41
0

@Connor Мне нужно иметь количество строк и количество столбцов из моего DF. В моем DF также есть выбор, это означает, что у меня есть таблица, и теперь вопрос в том, почему у меня нет функции SHAPE на моем DF?

Connor
19 августа 2021 в 20:06
0

Отличный вопрос, сделайте его отдельным вопросом по SO, поделитесь тем, что вы пробовали и что вы видите в результате (дайте полный рабочий набор кода, который легко воспроизвести другим), а затем поделитесь ссылкой на этот вопрос здесь. Я посмотрю, смогу ли я помочь

avatar
Nik
19 августа 2015 в 19:07
22

Помимо предыдущих ответов, вы можете использовать df.axes, чтобы получить кортеж с индексами строк и столбцов, а затем использовать функцию len():

total_rows = len(df.axes[0])
total_cols = len(df.axes[1])
cs95
30 марта 2019 в 20:13
3

Это возвращает индексные объекты, которые могут быть или не быть копиями оригинала, что является расточительным, если вы просто отбрасываете их после проверки длины. Если вы не собираетесь делать что-либо еще с индексом, НЕ ИСПОЛЬЗУЙТЕ .

avatar
Dr. Jan-Philip Gehrcke
19 августа 2013 в 15:02
213

Используйте len(df) :-).

__len__() задокументирован как «Возвращает длину индекса».

Информация о времени, настраивается так же, как в ответе root:

In [7]: timeit len(df.index)
1000000 loops, best of 3: 248 ns per loop

In [8]: timeit len(df)
1000000 loops, best of 3: 573 ns per loop

Из-за одного дополнительного вызова функции, конечно, правильно сказать, что он немного медленнее, чем вызов len(df.index) напрямую. Но в большинстве случаев это не имеет значения. Я считаю, что len(df) вполне читабельно.