Як я можу отримати кількість рядків панд DataFrame?


930

Я намагаюся отримати кількість рядків dfframe 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'

Що я роблю неправильно?


12
ОК, я з'ясував, я повинен був викликати метод не перевірити властивість, тому він повинен бути df.count () no df.count
yemu

56
^ Небезпечно! Остерігайтеся, що df.count()для кожного стовпця повернеться лише кількість рядків, що не належать до NA / NaN. Вам слід скористатися df.shape[0]замість цього, який завжди правильно підкаже вам кількість рядків.
smci

3
Зауважте, що df.count не поверне int, коли кадр порожній (наприклад, pd.DataFrame (стовпці = ["Синій", "Червоний"). Кількість не 0)
Marcelo Bielsa

Відповіді:


1248

Ви можете використовувати .shapeмайно або просто len(DataFrame.index). Однак є помітні відмінності в продуктивності (len(DataFrame.index) найшвидший):

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: df = pd.DataFrame(np.arange(12).reshape(4,3))

In [4]: df
Out[4]: 
   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8
3  9  10 11

In [5]: df.shape
Out[5]: (4, 3)

In [6]: timeit df.shape
2.77 µs ± 644 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [7]: timeit df[0].count()
348 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [8]: len(df.index)
Out[8]: 4

In [9]: timeit len(df.index)
990 ns ± 4.97 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

введіть тут опис зображення

EDIT: Як @Dan Allen зазначив у коментарях len(df.index)і df[0].count()не є взаємозамінними, оскільки countвиключає NaNs,


13
Є одна вагома причина, чому використовувати shapeв інтерактивній роботі замість len (df): Пробуючи різні фільтри, мені часто потрібно знати, скільки предметів залишилось. За формою я це бачу лише додавши .shape після моєї фільтрації. З len () редагування командного рядка стає набагато громіздкішим, ідучи вперед і назад.
К.-Майкл Айе

9
Не буде працювати для ОП, але якщо вам просто потрібно знати, чи порожній кадр даних, df.emptyце найкращий варіант.
jtschoonhoven

19
Я знаю, що минуло деякий час, але не довга (df.index) займає 381 наносекунд, або 0,381 мікросекунд, df.shape в 3 рази повільніше, займаючи 1,17 мікросекунди. я щось пропустив? @root
TG

11
(3,3) матриця є поганим прикладом, оскільки вона не показує порядок кортежу форми
xaedes

4
Як df.shape[0]швидше len(df)або len(df.columns)? Оскільки 1 нс (наносекунда) = 1000 мкс (мікросекунда), отже 1,17 мкс = 1170 нс, це означає, що це приблизно в 3 рази повільніше, ніж 381сс
йогоеф

303

Припустимо, dfце ваш фрейм даних:

count_row = df.shape[0]  # gives number of row count
count_col = df.shape[1]  # gives number of col count

Або, більш коротко,

r, c = df.shape

4
Якщо набір даних великий, len (df.index) значно швидше, ніж df.shape [0], якщо вам потрібно лише кількість рядків. Я тестував це.
Суміт Похрель

145

Використовуйте len(df). Це працює, як для панд 0,11 або, можливо, навіть раніше.

__len__()на даний момент (0,12) документально підтверджено Returns length of index. Інформація про час, налаштуйте так само, як у відповіді кореня:

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)безпосередньо, але це не повинно грати жодної ролі в більшості випадків використання.


81

Як я можу отримати кількість рядків панд DataFrame?

Ця таблиця підсумовує різні ситуації, в яких ви хочете щось порахувати у DataFrame (або серії для повноти), а також рекомендовані методи.

введіть тут опис зображення

Виноски

  1. DataFrame.countповертає підрахунок для кожного стовпця як а, Seriesоскільки ненульове число змінюється залежно від стовпця.
  2. DataFrameGroupBy.sizeповертає a Series, оскільки всі стовпці в одній групі мають одне і те ж число рядків.
  3. DataFrameGroupBy.countповертає a 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 - це атрибут, і він повертає кількість елементів (= кількість рядків для будь-якої серії). DataFrames також визначає атрибут розміру, який повертає той самий результат, що і df.shape[0] * df.shape[1].

Ненульовий ряд рядків: DataFrame.countіSeries.count

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

Виклик DataFrame.countповерне нелінійні підрахунки для кожного стовпця:

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повертається a . Це має сенс дляDataFrames того, що всі групи мають однаковий підрахунок рядків.

Груповий ненульовий ряд рядків: GroupBy.count

Подібно до вище, але використовувати GroupBy.count, ні GroupBy.size. Зауважте, що sizeзавжди повертає a Series, а countповертає a, Seriesякщо викликається у певному стовпці, або a 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

Викликається в конкретній колонці.


35

TL; DR

використання len(df)


len()є вашим другом, його можна використовувати для підрахунку рядків як len(df).

Крім того, ви можете отримати доступ до всіх рядків за df.indexвсіма стовпцями df.columnsі, як і ви можете використовувати len(anyList)для отримання підрахунку списку, використовувати len(df.index)для отримання кількості рядків таlen(df.columns) для кількості стовпців.

Або, ви можете використовувати , df.shapeякий повертає кількість рядків і стовпців разом, якщо ви хочете отримати доступ кількість рядків тільки використовувати df.shape[0]і для числа стовпців використовуйте тільки: df.shape[1].


19

Крім вищенаведених відповідей, використання може використовувати df.axesдля отримання кортежу з індексами рядків і стовпців, а потім використовувати len()функцію:

total_rows=len(df.axes[0])
total_cols=len(df.axes[1])

2
Це повертає об’єкти індексу, які можуть бути або не бути копіями оригіналу, що марно, якщо ви просто відкидаєте їх після перевірки довжини. Якщо ви не маєте наміру робити щось інше з індексом, НЕ ВИКОРИСТОВУЙТЕ .
cs95

9

... побудований на відповіді Яна-Філіпа Герке.

Причина, чому 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)

А під капотом len (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]


7

Я приходжу до панд з Rфону, і бачу, що панди складніші, коли справа доходить до вибору рядка чи стовпця. Мені довелося боротися з цим деякий час, тоді я знайшов кілька способів впоратися:

отримання кількості стовпців:

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

отримання кількості рядків:

len(df.index) #It's similar.

Після використання Pandas деякий час, я думаю, що ми повинні піти з цим df.shape. Він повертає кількість рядків і стовпців відповідно.
Catbuilts

4

Якщо ви хочете отримати кількість рядків посеред ланцюгової операції, ви можете використовувати:

df.pipe(len)

Приклад:

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

Це може бути корисно, якщо ви не хочете ставити довге твердження всередині len() функцію функції.

Ви можете використовувати це, __len__()але __len__()виглядає трохи дивно.


Мабуть, безглуздо хотіти "передати" цю операцію, тому що немає нічого іншого, в яке ви можете передати це (воно повертає ціле число). Я б швидше, count = len(df.reset_index())ніж count = df.reset_index().pipe(len). Перший - це лише пошук атрибутів без виклику функції.
cs95

1

Привіт, ви можете використовувати це також:

Скажімо, dfце ваш фрейм даних. Потім df.shapeнадає форму вашого фрейму даних, тобто(row,col)

Таким чином, призначте нижче команду, щоб отримати необхідну

 row = df.shape[0], col = df.shape[1]

0

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

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

Приклад:

nrow(my_df)
12,456,789

0

Альтернативний метод з'ясування кількості рядків у кадрі даних, який, на мою думку, є найбільш читаним варіантом pandas.Index.size.

Зауважте, що, як я коментував прийняту відповідь:

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


0

Я не впевнений, чи спрацювало б це (дані МУЖЕ бути опущені), але це може працювати:

*dataframe name*.tails(1)

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


-2

Будь-яке з цього може зробити ( dfце ім'я DataFrame):

Спосіб 1: Використання lenфункції:

len(df)дасть кількість рядків у імені DataFrame df.

Спосіб 2: використання countфункції:

df[col].count()буде рахувати кількість рядків у заданому стовпчику col.

df.count() дасть кількість рядків для всіх стовпців.


3
Це прекрасна відповідь, але відповідей на це питання вже достатньо, тому це насправді нічого не додає.
Іван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.