Более простой способ распределения элементов списка в новый столбец фрейма данных pandas в определенном соотношении, зависящем от других значений столбца того же фрейма данных

#python #pandas #dataframe #numpy #data-science

#python #pandas #фрейм данных #numpy #наука о данных

Вопрос:

У меня есть фрейм данных pandas df с несколькими столбцами. Теперь я хочу добавить новый столбец на основе других значений столбца. Я нашел много ответов на это в стеке, который включает np.where в себя и np.select . Однако в моем случае для каждого условия if (каждого блока if / elif / else) новый столбец должен выбирать из 3 значений с определенным соотношением. Например,

 for i in range(df.shape[0]):
    if(df.iloc[i]['col1']==x):
        df.iloc[i]['new_col']= choose one value between l=['a','b','c'] in 0.3,0.3,0.4 ratio
 

то есть для всех строк, удовлетворяющих условию в if инструкции, элементы списка l должны быть распределены в указанном выше соотношении к новому столбцу.

  • Текущий способ, которым я занимаюсь, — разделить его df на несколько фреймов данных df_sub для каждого if-else условного оператора. Затем создайте список, используя np.random.choices(l,df_sub.shape[0],p=[0.3,0.3,0.4) where l=['a','b','c'] . Добавьте l в df_sub качестве нового столбца, а затем присоедините все эти вспомогательные фреймы данных axis=0 .
  • Я хочу знать, есть ли более простой способ выполнить эту задачу вместо разделения и объединения фреймов данных?

Ответ №1:

Попробуйте:

 s = df['col1'] == x
df.loc[s, 'new_col'] = np.random.choice(['a','b','c'], 
                                        size=s.sum(), 
                                        p=[0.3,0.3,0.4])