Pandas: удалить элементы с менее чем 2 ненулевыми значениями - PullRequest
1 голос
/ 28 мая 2020
• 1000 ProductCode, который имеет менее 2 ненулевых значений в Weekly_Units_Sold; код должен удалить все строки, принадлежащие обнаруженному ProductCode.

Допустим, обнаружен ProductCode 1, в значениях столбца Weekly_Units_Sold только 1 ненулевой, а все его 29 других значений равны 0. Хотите удалить все 30 строк, принадлежащих ProductCode 1, из фрейма данных,

Date    ProductCode Weekly_Units_Sold
2015-08-09   2       46.0
2015-08-09   3       31.0
 ...         ...      ...
2015-08-09   317     47.0
2015-08-16   2       46.0
2015-08-16   3       31.0
  ...       ...
2015-08-16  317      75.0
2015-08-23   2       90.0
2015-08-23   3       175.0
....         ...   
2015-08-23  317      20.0
 ....      ...       ..
2015-12-27   2       30.0
2015-12-27   3       150.0
....         ...   
2015-12-27  317      20.0

Какой лучший способ Pythonisti c это сделать? Спасибо!

1 Ответ

1 голос
/ 28 мая 2020

Я немного отредактировал ваши демонстрационные данные, чтобы создать рабочий пример.

Date    ProductCode Weekly_Units_Sold
2015-08-09   1       46.0
2015-08-09   2       46.0
2015-08-09   3       31.0
2015-08-09   317     47.0
2015-08-16   1       0
2015-08-16   2       46.0
2015-08-16   3       31.0
2015-08-16  317      75.0
2015-08-23   1       0.0
2015-08-23   2       90.0
2015-08-23   3       175.0
2015-08-23  317      20.0
2015-12-27   1       0.0
2015-12-27   2       30.0
2015-12-27   3       150.0
2015-12-27  317      20.0

Здесь мы начинаем с pd.read_clipboard () на вышеуказанных данных.

df = pd.read_clipboard()

print(df)

Date    ProductCode Weekly_Units_Sold
0   2015-08-09  1   46.0
1   2015-08-09  2   46.0
2   2015-08-09  3   31.0
3   2015-08-09  317 47.0
4   2015-08-16  1   0.0
5   2015-08-16  2   46.0
6   2015-08-16  3   31.0
7   2015-08-16  317 75.0
8   2015-08-23  1   0.0
9   2015-08-23  2   90.0
10  2015-08-23  3   175.0
11  2015-08-23  317 20.0
12  2015-12-27  1   0.0
13  2015-12-27  2   30.0
14  2015-12-27  3   150.0
15  2015-12-27  317 20.0

Мы группируем по ProductCode и создаем строковые списки всех значений Weekly_Units_Sold в столбце Weekly_Units_Sold. -нулевые значения.

df_gb['non_zero_lt_two'] = df_gb['Weekly_Units_Sold'].apply(lambda x: True if np.count_nonzero(np.array(x)) < 2 else False)

print (df_gb)

        Weekly_Units_Sold           non_zero_lt_two
ProductCode     
1       [46.0, 0.0, 0.0, 0.0]       True
2       [46.0, 46.0, 90.0, 30.0]    False
3       [31.0, 31.0, 175.0, 150.0]  False
317     [47.0, 75.0, 20.0, 20.0]    False

Затем мы можем превратить строки значений True в список.

prod_code_list = df_gb.index[df_gb['non_zero_lt_two'] == True].tolist()

И, наконец, удалите нужные строки из исходного df.

df = df[~df['ProductCode'].isin(prod_code_list)]

print(df)

Date    ProductCode Weekly_Units_Sold
1   2015-08-09  2   46.0
2   2015-08-09  3   31.0
3   2015-08-09  317 47.0
5   2015-08-16  2   46.0
6   2015-08-16  3   31.0
7   2015-08-16  317 75.0
9   2015-08-23  2   90.0
10  2015-08-23  3   175.0
11  2015-08-23  317 20.0
13  2015-12-27  2   30.0
14  2015-12-27  3   150.0
15  2015-12-27  317 20.0
...