У меня есть 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
Мое решение
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 сверху или столбцом слева? Если во-первых, то ваш результат неверен. Если во-вторых, тогда у вас недостаточно значений в 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]
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
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
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