#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 одинаково.