首页 > 解决方案 > 在一列中有 3 个不同的值并将它们替换为熊猫中的 0/1?

问题描述

我有以下数据框:

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'更改为1, 'b'to0和 50% 的to'c'150% 的 to 0 ?col1

所以col1可能看起来像这样[1,0,1,0,1,0,0,1]

标签: pythonpython-3.xpandas

解决方案


比较c掩码 by 的值Series.eq,然后使用Series.map字典设置值,最后Series.sample仅通过过滤值设置 50% 的值:

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

或者,您可以过滤值并通过大小类似于 original 的掩码添加False值:Series.reindexDataFrame

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 解决方案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())

推荐阅读