Наличие 3 различных значений в столбце и замена их на 0/1 в pandas?

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

У меня есть следующий фрейм данных:

 d = {'col1':['a','b','c','b','a','c','c','c'],'col2':[1,2,3,4,5,6,7,8]}
df = pd.DataFrame(data=d)
  

Интересно, как я могу изменить 'a' значение to 1 , 'b' to 0 и 50% от 'c' to 1 и 50% от остальных на 0 col1 в произвольном порядке?

Так col1 может выглядеть так [1,0,1,0,1,0,0,1]

Комментарии:

1. Возможно, вам придется создать a function самостоятельно, чтобы выполнить эту конкретную работу.

Ответ №1:

Сравните значения по c для маски по Series.eq , затем используйте Series.map для набора значений по словарю и в последний раз устанавливайте 50% значений Series.sample только по отфильтрованным значениям:

 m = df['col1'].eq('c')
df['col1'] = df['col1'].map({'a':1, 'b':0, 'c':0})

df.loc[df[m].sample(frac = 0.5).index, 'col1'] = 1
  

Или вы можете фильтровать значения и добавлять False значения Series.reindex по маске с размером, подобным оригиналу DataFrame :

 m = df['col1'].eq('c')
df['col1'] = df['col1'].map({'a':1, 'b':0, 'c':0})

mask = m[m].sample(frac = 0.5).reindex(df.index, fill_value=False)
df.loc[mask, 'col1'] = 1
print (df)
   col1  col2
0     1     1
1     0     2
2     1     3
3     0     4
4     1     5
5     1     6
6     0     7
7     0     8
  

Простое решение с numpy.random.choice :

 m = df['col1'].eq('c')
df['col1'] = df['col1'].map({'a':1, 'b':0, 'c':0})

df.loc[m, 'col1'] = np.random.choice([0,1], p=[0.5, 0.5], size=m.sum())
  

Комментарии:

1. Второй метод был моим выбором просто потому, что случайный выбор распределяет 50-50 одинаково.