Удалить строки в 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) Чтобы отфильтровать (удалить строки) 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]: TruePS объединить данные из нескольких 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') Войдите чтобы оставить ответ