Замените одно значение столбца другим значением, выбранным случайным образом из нескольких столбцов в Python

#python-3.x #pandas #dataframe

#python-3.x #панды #фрейм данных

Вопрос:

Учитывая набор данных следующим образом:

   city  value1  March  April  May  value2  Jun  Jul  Aut
0   bj      12    NaN    NaN  NaN      15  NaN  NaN  NaN
1   sh       8    NaN    NaN  NaN      13  NaN  NaN  NaN
2   gz       9    NaN    NaN  NaN       9  NaN  NaN  NaN
3   sz       6    NaN    NaN  NaN      16  NaN  NaN  NaN
 

Я хотел бы заполнить value1 , чтобы случайным образом выбрать один столбец 'March', 'April', 'May' , а также заполнить value2 один столбец , выбранный случайным 'Jun', 'Jul', 'Aut' образом .

Желаемый результат:

   city  value1  March  April  May  value2   Jun   Jul   Aut
0   bj      12    NaN   12.0  NaN      15   NaN  15.0   NaN
1   sh       8    8.0    NaN  NaN      13   NaN   NaN  13.0
2   gz       9    NaN    NaN  9.0       9   NaN   9.0   NaN
3   sz       6    NaN    6.0  NaN      16  16.0   NaN   NaN
 

Как я мог бы сделать это на Python? Спасибо.

Ответ №1:

Вот один из способов, определив функцию, которая случайным образом выбирает индексы из фрагмента фрейма данных, как определено переданным cols , затем заполняет соответствующие значения из столбца значений ( val_col ), переданного функции:

 def fill(df, val_col, cols):
    i = np.random.choice(len(cols), len(df))
    vals = df[cols].to_numpy()
    vals[range(len(df)), i] = list(df[val_col])
    return df.assign(**dict(zip(cols, vals.T)))
 

 >>> df = fill(df, 'value1', ['March', 'April', 'May'])
>>> df

  city  value1  March  April  May  value2  Jun  Jul  Aut
0   bj      12   12.0    NaN  NaN      15  NaN  NaN  NaN
1   sh       8    NaN    NaN  8.0      13  NaN  NaN  NaN
2   gz       9    NaN    9.0  NaN       9  NaN  NaN  NaN
3   sz       6    NaN    6.0  NaN      16  NaN  NaN  NaN

>>> df = fill(df, 'value2', ['Jun', 'Jul', 'Aut'])
>>> df

  city  value1  March  April   May  value2   Jun  Jul   Aut
0   bj      12    NaN    NaN  12.0      15   NaN  NaN  15.0
1   sh       8    NaN    NaN   8.0      13  13.0  NaN   NaN
2   gz       9    NaN    NaN   9.0       9   NaN  NaN   9.0
3   sz       6    NaN    6.0   NaN      16   NaN  NaN  16.0