Очистка данных: удалить значение 0 из моего набора данных, имеющего заголовок и index_col - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть набор данных, показанный ниже.

enter image description here

Я хотел бы сделать три вещи.Шаг 1: AA-CC являются индексом, а не фактическим набором данных, однако с удовольствием сохранят его в будущем.Шаг 2: Посчитайте значение 0 для каждой строки.Шаг 3: Если 0 больше 20% в строке, что означает более 2 в этом случае, поскольку от ДД до ММ составляет 10 столбцов, удалите строку.Таким образом, я сделал глупый способ выполнить вышеупомянутые три шага.

df = pd.read_csv("dataset.csv", header=None)
df_bool = (df == "0")
print(df_bool.sum(axis=1))

, тогда я получил ожидаемый результат, показанный ниже.

0 0
1 0
2 1
3 0
4 1
5 8
6 1
7 0

Поэтому удалил строку # 5, как я указал ниже.

df2 = df.drop([5], axis=0)
print(df2)

Это хорошо работает, даже если это не элегантный, хотя и глупый путь.Однако, если я импортирую свой набор данных как header = 0, тогда этот подход не сработает вообще.

df = pd.read_csv("dataset.csv", header=0)

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0

Почему это происходит?Кроме того, если я хотел бы написать код с функциями loop, count и drop, как будет выглядеть код?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Было бы замечательно, если бы вы опубликовали, как выглядит кадр данных в пандах, а не как изображение файла Excel.Однако, построив фиктивный df

 df = pd.DataFrame({'index1':['a','b','c'],'index2':['b','g','f'],'index3':['w','q','z']
              ,'Col1':[0,1,0],'Col2':[1,1,0],'Col3':[1,1,1],'Col4':[2,2,0]})

Step1, присвоение индекса может быть выполнено с использованием метода .set_index (), как указано ниже

df.set_index(['index1','index2','index3'],inplace=True)

вместоделая все вручную, когда дело доходит до фильтрации, вы можете использовать возврат, полученный из df_bool.sum(axis=1) при фильтрации кадра данных, как указано ниже

df.loc[(df==0).sum(axis=1) / (df.shape[1])>0.6]
index1  index2  index3  Col1    Col2    Col3    Col4
c       f       z       0       0       1       0

, и, используя это, вы можете отбросить эти строки, предполагая 20% тогда вы бы использовали

df = df.loc[(df==0).sum(axis=1) / (df.shape[1])<0.2]

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

0 голосов
/ 30 ноября 2018

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

Сначала мы вычисляем количество столбцов и число нулей в строке:

n_columns = len(df.columns)  # or df.shape[1]
zeroes = (df == "0").sum(axis=1)

Затем выбираем толькостроки с нулями менее 20%.

proportion_zeroes = zeroes / n_columns
max_20 = proportion_zeroes < 0.20
df[max_20]  # This will contain only rows that have less than 20 % zeroes

Одна строка:

df[((df == "0").sum(axis=1) / len(df.columns)) < 0.2]
...