Замена номера по краям

1

У меня есть dataframe только с 0 и 127. 127s сгруппированы вместе, как показано в примере.

df = DataFrame({'f1' : [0,0,0,0,0,0],
'f2' : [0,0,0,0,0,0],
'f3' : [0,0,127,127,0,0],
'f4' : [0,127,127,127,0,0],
'f5' : [0,127,127,127,127,0],
'f6' : [0,127,127,127,127,0],
'f7' : [0,0,127,127,127,0],
'f8' : [0,0,127,127,0,0],
'f9' : [0,0,127,0,0,0],
'f10' : [0,0,0,0,0,0]
})

    f1  f2   f3   f4   f5   f6   f7   f8   f9  f10
0   0   0    0    0    0    0    0    0    0    0
1   0   0    0  127  127  127    0    0    0    0
2   0   0  127  127  127  127  127  127  127    0
3   0   0  127  127  127  127  127  127    0    0
4   0   0    0    0  127  127  127    0    0    0
5   0   0    0    0    0    0    0    0    0    0

Учитывая список чисел num_of_cells_to_del, я хочу случайным образом очистить это количество ячеек в определенном столбце randomly from top or bottom.

num_of_cells_to_del = [0,0,0,1,1,2,2,1,0,0]

Результат:

        f1  f2  f3  f4  f5  f6  f7  f8  f9  f10
   0    0   0   0   0   0   0   0   0   0   0
   1    0   0   0   0   127 0   0   0   0   0
   2    0   0   127 127 127 0   0   0   127 0
   3    0   0   127 127 127 127 127 127 0   0
   4    0   0   0   0   0   127 0   0   0   0
   5    0   0   0   0   0   0   0   0   0   0
Теги:
pandas

2 ответа

0

Мое решение

for col, cells in zip(df.columns, num_of_cells_to_del):
  col_vals = df[col].values
  non_zero = np.where(col_vals == 127)[0] # find which indices have 127
  if len(non_zero) < cells: # can't delete more that what present!
    raise Exception('Not enough 127 in the column!')
  if len(non_zero) == 0:
    continue
  replace_indices = np.random.choice(non_zero, size=cells, replace=False) # choose random indices to delete
  col_vals[replace_indices] = 0
  df[col] = col_vals
0

Не полностью понять ваш пример. Вы хотите поставить 0 сверху или столбцом слева? Если во-первых, то ваш результат неверен. Если во-вторых, тогда у вас недостаточно значений в num_of_cells_to_del

В любом случае ниже код для обоих:

вход

import pandas as pd
df = pd.DataFrame({'f1' : [0,0,0,0,0,0],
'f2' : [0,0,0,0,0,0],
'f3' : [0,0,127,127,0,0],
'f4' : [0,127,127,127,0,0],
'f5' : [0,127,127,127,127,0],
'f6' : [0,127,127,127,127,0],
'f7' : [0,0,127,127,127,0],
'f8' : [0,0,127,127,0,0],
'f9' : [0,0,127,0,0,0],
'f10' : [0,0,0,0,0,0]
})
print(df)
   f1  f2   f3   f4   f5   f6   f7   f8   f9  f10
0   0   0    0    0    0    0    0    0    0    0
1   0   0    0  127  127  127    0    0    0    0
2   0   0  127  127  127  127  127  127  127    0
3   0   0  127  127  127  127  127  127    0    0
4   0   0    0    0  127  127  127    0    0    0
5   0   0    0    0    0    0    0    0    0    0
num_of_cells_to_del = [0,1,1,2,2,0]

0 по строкам

for i, r in enumerate(df.iterrows()):
    if i<len(num_of_cells_to_del):
        df.iloc[0:num_of_cells_to_del[i],i]=0
print(df)
   f1  f2   f3   f4   f5   f6   f7   f8   f9  f10
0   0   0    0    0    0    0    0    0    0    0
1   0   0    0    0    0  127    0    0    0    0
2   0   0  127  127  127  127  127  127  127    0
3   0   0  127  127  127  127  127  127    0    0
4   0   0    0    0  127  127  127    0    0    0
5   0   0    0    0    0    0    0    0    0    0

0 по столбцам

for i, c in enumerate(df.keys()):
    if i<len(num_of_cells_to_del):
        df.loc[0:num_of_cells_to_del[i],c]=0
print(df)
   f1  f2   f3   f4   f5   f6   f7   f8   f9  f10
0   0   0    0    0    0    0    0    0    0    0
1   0   0    0    0    0  127    0    0    0    0
2   0   0  127    0    0  127  127  127  127    0
3   0   0  127  127  127  127  127  127    0    0
4   0   0    0    0  127  127  127    0    0    0
5   0   0    0    0    0    0    0    0    0    0

0 по столбцам и случайным образом сверху или снизу

for i, c in enumerate(df.keys()):
    if i<len(num_of_cells_to_del):
        if np.random.rand()>0.5:
            df.loc[0:num_of_cells_to_del[i],c]=0
        elif num_of_cells_to_del[i]>0:
            df.loc[-num_of_cells_to_del[i]:,c]=0
print(df)
   f1  f2   f3   f4   f5   f6   f7   f8   f9  f10
0   0   0    0    0    0    0    0    0    0    0
1   0   0    0    0    0    0    0    0    0    0
2   0   0  127  127  127    0    0  127  127    0
3   0   0  127  127  127  127  127  127    0    0
4   0   0    0    0  127  127  127    0    0    0
5   0   0    0    0    0    0    0    0    0    0
  • 0
    Я обновил ОП. Ваше решение выглядит хорошо, но удаление является случайным, либо сверху вниз
  • 0
    Обновлен и добавлен для выбора случайным образом сверху или снизу

Ещё вопросы

Сообщество Overcoder
Наверх
Меню