Как фильтровать фрейм данных pandas на основе длины записи

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

В фрейме данных pandas у меня есть поле ‘amp’, которое должно быть заполнено списком длиной 495. Есть ли способ panda-ic для быстрой фильтрации по этой длине, чтобы все строки с полем ‘amp’ не были равны 495, отбрасывались?

Я пытался

 df[len(df['amp']) == 495]
  

и это вернуло

 KeyError: False
  

Комментарии:

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

Ответ №1:

Если вам конкретно нужно len , то ответ @MaxU является лучшим.

Для более общего решения вы можете использовать метод сопоставления ряда.

 df[df['amp'].map(len) == 495]
  

Это будет применяться len к каждому элементу, который вам нужен. С помощью этого метода вы можете использовать любую произвольную функцию, а не только len .

Комментарии:

1. можете ли вы переключить != на ==, цель — сохранить только массивы 495. thx

Ответ №2:

Попробуйте это:

 df[df['amp'].str.len() == 495]
  

ДЕМОНСТРАЦИЯ:

 In [77]: df
Out[77]:
                 a
0  [1, 2, 3, 4, 5]
1        [1, 2, 3]
2             [-1]

In [78]: df.a.str.len()
Out[78]:
0    5
1    3
2    1
Name: a, dtype: int64

In [79]: df[df.a.str.len() == 3]
Out[79]:
                 a
1        [1, 2, 3]
  

Комментарии:

1. Работает ли это, даже если элемент a list , а не a str ?

2. Аккуратно. Вероятно, им следует обновить свою документацию, чтобы указать, что она может работать для любого типа, который поддерживает len . Из API : «Вычислить длину каждой строки в ряду / индексе»..

3. @SethMMorton, пожалуйста, не стесняйтесь создавать «Запрос на извлечение» на GitHub (просто пометьте его как «DOC: …») — это было бы действительно полезно 🙂

4. Вау, это здорово, спасибо! ответ @SethMMorton немного более общий (и научил меня использовать map), поэтому я выбрал это, но большое спасибо за это!

5. @MaxU можете ли вы переключить != на == , цель — сохранить только массивы из 495