Удалить строку с нулевым значением из кадра данных pandas

Я пытаюсь удалить строку из моего фрейма данных, в которой один из столбцов имеет значение null. Большая часть помощи, которую я могу найти, связана с удалением значений NaN, которые до сих пор не работали для меня.

Здесь я создал фрейм данных:

  # successfully crated data frame
 df1 = ut.get_data(symbols, dates) # column heads are 'SPY', 'BBD'

# can't get rid of row containing null val in column BBD
# tried each of these with the others commented out but always had an 
# error or sometimes I was able to get a new column of boolean values
# but i just want to drop the row
df1 = pd.notnull(df1['BBD']) # drops rows with null val, not working
df1 = df1.drop(2010-05-04, axis=0)
df1 = df1[df1.'BBD' != null]
df1 = df1.dropna(subset=['BBD'])
df1 = pd.notnull(df1.BBD)


# I know the date to drop but still wasn't able to drop the row
df1.drop([2015-10-30])
df1.drop(['2015-10-30'])
df1.drop([2015-10-30], axis=0)
df1.drop(['2015-10-30'], axis=0)


with pd.option_context('display.max_row', None):
    print(df1)

Вот мой вывод:

Output

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

Я не работал с пандами очень долго, и я застрял на этом в течение часа. Любые советы будут высоко ценится.

Ответ 1

Это должно сделать работу:

df = df.dropna(how='any',axis=0) 

Он стирает каждую строку (ось = 0), которая имеет в ней "любое" значение Null.

ПРИМЕР:

#Recreate random DataFrame with Nan values
df = pd.DataFrame(index = pd.date_range('2017-01-01', '2017-01-10', freq='1d'))
# Average speed in miles per hour
df['A'] = np.random.randint(low=198, high=205, size=len(df.index))
df['B'] = np.random.random(size=len(df.index))*2

#Create dummy NaN value on 2 cells
df.iloc[2,1]=None
df.iloc[5,0]=None

print(df)
                A         B
2017-01-01  203.0  1.175224
2017-01-02  199.0  1.338474
2017-01-03  198.0       NaN
2017-01-04  198.0  0.652318
2017-01-05  199.0  1.577577
2017-01-06    NaN  0.234882
2017-01-07  203.0  1.732908
2017-01-08  204.0  1.473146
2017-01-09  198.0  1.109261
2017-01-10  202.0  1.745309

#Delete row with dummy value
df = df.dropna(how='any',axis=0)

print(df)

                A         B
2017-01-01  203.0  1.175224
2017-01-02  199.0  1.338474
2017-01-04  198.0  0.652318
2017-01-05  199.0  1.577577
2017-01-07  203.0  1.732908
2017-01-08  204.0  1.473146
2017-01-09  198.0  1.109261
2017-01-10  202.0  1.745309

Подробнее см. Ссылку.

Если с вашим DataFrame все в порядке, сброс NaN должен быть таким же простым. Если это еще не работает, убедитесь, что у вас есть соответствующие типы данных, определенные для вашего столбца (pd.to_numeric приходит на ум...)

Ответ 2

Похоже, что значение в вашем столбце равно "null", а не истинному NaN, для чего и предназначен дропна. Поэтому я бы попробовал:

df[df.BBD != 'null']

или, если значение на самом деле является NaN, то

df[pd.notnull(df.BBD)]

Ответ 3

----clear null all colum-------

df = df.dropna(how='any',axis=0)

---if вы хотите очистить NULL, основываясь на 1 столбце.---

df[~df['B'].isnull()]

                A         B
2017-01-01  203.0  1.175224
2017-01-02  199.0  1.338474
                              **2017-01-03  198.0       NaN** clean
2017-01-04  198.0  0.652318
2017-01-05  199.0  1.577577
2017-01-06    NaN  0.234882
2017-01-07  203.0  1.732908
2017-01-08  204.0  1.473146
2017-01-09  198.0  1.109261
2017-01-10  202.0  1.745309

Пожалуйста, прости любые ошибки.

Ответ 4

Вы можете попробовать следующее:

df.dropna(inplace=True)

Это сработало для меня.