Avatar ·

Удалить строки в DataFrame удовлетворяющие условию

📁 python, pandas, jupyter

Как удалить строки в Pandas DataFrame, в которых значения в столбце STP == 1005092?

Подробно:

Я занимаюсь обработкой данных в Jupyter notebook: нормальное распределение, спектрограммы, гистограммы и тп. У меня есть 1500 тысячи проиндексированных массивов внутри одного файла (Индекс ''STP''). Есть 2 массива которые не подходят по показаниям (явно выделяются из остальных 1498 значений), но проходят тест на нормальное распределение, из-за чего не фильтруются программой. Я пробовал команды data.STP.remove(1005072), где семизначное число - это индекс массива, но все тщетно.

Код:

cols = ['ttt','IK05','IK06','IK07','IK08','IK10','IK11','IK14','IK16','IK20','DA05','DA06','DA07','DA08','DA10','DA11','DA14','DA16', 'DA20','GZ1','GZ2','GZ3','GZ4', 'LLS', 'LLD', 'STP']def lasread (fname):    data = pd.read_table(fname, delim_whitespace = True,na_values = '-999.25', index_col=False)    retu data[cols]data = Nonefor name in las:     print(name)    if data is None:        data = lasread (name)    else:        data = pd.concat([data, lasread (name)])ndata = data.STP.as_matrix(columns=None)df = data[cols]df1 = df.groupby('STP')df1.head()dfp  = pd.DataFrame()for name, group in df1:     k,p=stats.mstats.normaltest(group[5:-5])     dfp[name] = pd=dfp.transpose()d.columns = colsgoodindex = d[d.IK20>0.05][d.DA20>0.05].index - отбраковка по СКО**data.STP.remove(1005072)**filtereddata = data[cols][data.STP == -39]for f in goodindex:     a = data[cols][data.STP == f]     filtereddata = pd.concat([filtereddata, a])print(filtereddata)
Avatar ·

Чтобы отфильтровать (удалить строки) DataFrame по критерию: ""удалить строки в которых значения в столбце STP == 1005092""

Вариант 1: фильтруем по одному значению:

df = df.loc[df['STP'] != 1005092]

Вариант 2: можно указать несколько значений:

df = df.loc[~df['STP'].isin([1005092])]

Вариант 3: фильтруем по одному значению:

df = df.query(""STP != 1005092"")

Вариант 4: можно указать несколько значений:

df = df.query(""STP not in [1005092, ...]"")

Вариант 5:

df = df.drop(np.where(df['STP'] == 1005092)[0])

Примеры:

In [69]: new = df.loc[~df['STP'].isin([1005092])]In [70]: df.shapeOut[70]: (1488, 26)In [71]: new.shapeOut[71]: (978, 26)In [72]: new2 = df.query(""STP != 1005092"")In [73]: new3 = df.query(""STP not in [1005092]"")In [74]: new.equals(new2)Out[74]: TrueIn [75]: new.equals(new3)Out[75]: True

PS объединить данные из нескольких CSV (с одинаковой структурой) можно следующим образом:

def read_all_csv(files, **kwargs):    retu pd.concat([pd.read_csv(f, **kwargs) for f in files], ignore_index=True)cols = ['ttt','IK05','IK06','IK07','IK08','IK10','IK11','IK14','IK16','IK20',        'DA05','DA06','DA07','DA08','DA10','DA11','DA14','DA16', 'DA20','GZ1',        'GZ2','GZ3','GZ4', 'LLS', 'LLD', 'STP']# read them all                       df = read_all_csv(las, usecols=cols, delim_whitespace=True, na_values='-999.25')

Войдите чтобы оставить ответ

Блоги