как выполнить итерацию через несколько PDF и удалить те столбцы, которые содержат только NA [duplicate]

Вы хотите, чтобы первый >, которому не предшествовал /. Посмотрите здесь , чтобы узнать, как это сделать.

Однако наивная реализация этого приведет к сопоставлению в этом примере документа


Можете ли вы предоставить немного больше информации о проблема, которую вы пытаетесь решить? Вы выполняете итерацию через теги программно?

455
задан Ninjakannon 5 January 2017 в 18:01
поделиться

9 ответов

Не drop. Просто возьмите строки, где EPS конечен:

df = df[np.isfinite(df['EPS'])]
358
ответ дан eumiro 16 August 2018 в 04:04
поделиться
  • 1
    Я рекомендую использовать pandas.notnull вместо np.isfinite – Wes McKinney 21 November 2012 в 05:08
  • 2
    Есть ли какие-либо преимущества для индексирования и копирования при удалении? – Robert Muil 31 July 2015 в 08:15
  • 3
    Создает ошибку: TypeError: ufunc 'isfinite' не поддерживается для типов ввода, и входы не могут быть безопасно привязаны к любым поддерживаемым типам в соответствии с правилом литья '' safe '' – Philipp Schwarz 7 October 2016 в 13:18
  • 4
    @ wes-mckinney может, пожалуйста, дайте мне знать, если dropna () - лучший выбор по сравнению с pandas.notnull в этом случае? Если да, то почему? – stormfield 7 September 2017 в 11:53
  • 5
    @PhilippSchwarz Эта ошибка возникает, если столбец (EPS в примере) содержит строки или другие типы, которые нельзя переварить np.isfinite(). Я рекомендую использовать pandas.notnull(), который будет обрабатывать это более щедро. – normanius 5 April 2018 в 10:02

Он может быть добавлен при этом '& amp;' может использоваться для добавления дополнительных условий, например

df = df[(df.EPS > 2.0) & (df.EPS <4.0)]

Обратите внимание, что при оценке утверждений панды нужны скобки.

0
ответ дан aesede 16 August 2018 в 04:04
поделиться
  • 1
    Извините, но я хочу что-то еще. Если ваш код неверен, верните ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().. Вам нужно добавить круглые скобки - df = df[(df.EPS > 2.0) & (df.EPS <4.0)], но также это не ответ на этот вопрос. – jezrael 16 March 2016 в 12:52

Вы можете использовать метод dataframe notnull или инвертировать isnull или numpy.isnan :

In [332]: df[df.EPS.notnull()]
Out[332]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [334]: df[~df.EPS.isnull()]
Out[334]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN


In [347]: df[~np.isnan(df.EPS)]
Out[347]:
   STK_ID  RPT_Date  STK_ID.1  EPS  cash
2  600016  20111231    600016  4.3   NaN
4  601939  20111231    601939  2.5   NaN
19
ответ дан Anton Protopopov 16 August 2018 в 04:04
поделиться

Я знаю, что это уже было дан ответ, но только ради чисто пандского решения этого конкретного вопроса, в отличие от общего описания из Амана (что было замечательно), и в случае, если кто-то еще случится на этом:

import pandas as pd
df = df[pd.notnull(df['EPS'])]
83
ответ дан Kirk Hadley 16 August 2018 в 04:04
поделиться
  • 1
    Собственно, конкретным ответом будет: df.dropna(subset=['EPS']) (на основе общего описания Амана, конечно, это также работает) – joris 23 April 2014 в 13:53
  • 2
    notnull также является тем, что Wes (автор Pandas) предложил в своем комментарии к другому ответу. – fantabolous 9 July 2014 в 04:24
  • 3
    Это может быть вопрос о нобе. Но когда я делаю df [pd.notnull (...) или df.dropna, индекс падает. Таким образом, если в индексе строк 10 в df длины 200 имелось нулевое значение. В кадре данных после запуска функции кавычек имеются значения индекса от 1 до 9, а затем от 11 до 200. В любом случае, чтобы «переиндексировать», Это – Aakash Gupta 4 March 2016 в 07:03

еще одно решение, которое использует тот факт, что np.nan != np.nan:

In [149]: df.query("EPS == EPS")
Out[149]:
                 STK_ID  EPS  cash
STK_ID RPT_Date
600016 20111231  600016  4.3   NaN
601939 20111231  601939  2.5   NaN
8
ответ дан MaxU 16 August 2018 в 04:04
поделиться

Вы можете использовать это:

df.dropna(subset=['EPS'], how='all', inplace = True)
28
ответ дан Mojtaba Khodadadi 16 August 2018 в 04:04
поделиться
  • 1
    how='all' здесь избыточно, потому что вы подмножите данные только с одним полем, так что оба 'all' и 'any' будут иметь тот же эффект. – Anton Protopopov 16 January 2018 в 13:41

По какой-то причине ни один из ранее представленных ответов не работал для меня. Это базовое решение:

df = df[df.EPS >= 0]

Хотя, конечно, это также приведет к потере строк с отрицательными номерами. Так что, если вы хотите, то это, вероятно, полезно добавить и после этого.

df = df[df.EPS <= 0]
-1
ответ дан samthebrand 16 August 2018 в 04:04
поделиться

Самый простой из всех решений:

filtered_df = df[df['EPS'].notnull()]

Вышеупомянутое решение лучше, чем использование np.isfinite ()

614
ответ дан user2285236 16 August 2018 в 04:04
поделиться
  • 1
    вы также можете использовать df.dropna(subset = ['column_name']). Надеюсь, что спасет хотя бы одного человека дополнительные 5 секунд «что я делаю неправильно». Отличный ответ, +1 – James Tobin 18 June 2014 в 15:07
  • 2
    @JamesTobin, я просто потратил 20 минут, чтобы написать функцию для этого! Официальная документация была очень загадочной: «Ярлыки вдоль другой оси, чтобы рассмотреть, например. если вы отбрасываете строки, это будет список столбцов для включения & quot ;. Я не мог понять, что они имели в виду ... – osa 6 September 2014 в 00:52
  • 3
    Это должно быть №1 – Cord Kaldemeyer 20 October 2017 в 13:10
  • 4
    isfinite (), вероятно, более pythonic, но этот ответ более изящный и соответствует принципам pandas. Отличный ответ. – TheProletariat 20 March 2018 в 22:51
622
ответ дан user2285236 6 September 2018 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: