ah bon
ah bon

Reputation: 10011

Fill one column value to another one randomly selected from multiple columns in Python

Given a dataset as follows:

  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

I would like to fill value1 to randomly select one column from 'March', 'April', 'May', also fill value2 to one column randomly selected from 'Jun', 'Jul', 'Aut'.

Output desired:

  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

How could I do that in Python? Thanks.

Upvotes: 1

Views: 82

Answers (1)

Shubham Sharma
Shubham Sharma

Reputation: 71689

Here is one way by defining a function which randomly selects the indices from the slice of dataframe as defined by the passed cols then fills the corresponding values from the value column (val_col) passed to the function:

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

Upvotes: 2

Related Questions