python - 在一列中有 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'
和1
50% 的 to 0 ?col1
所以col1
可能看起来像这样[1,0,1,0,1,0,0,1]
解决方案
比较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.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 解决方案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())
推荐阅读
- grafana - Grafana 通过 API 覆盖现有仪表板
- vb.net - VB.NET 以新形式从发件人更改文本
- angular - 在 Angular 9 CLI webworker 中导入 mathjs 时出错
- java - FragmentManager 尚未附加到主机
- r - 如何在 r 中使用 group_by 来解决我的问题。还有其他解决方案吗?
- java - Deepspeech java.lang.UnsatisfiedLinkError:/usr/lib/libdeepspeech-jni.so:liblog.so:错误的 ELF 类:ELFCLASS32
- r - 将多个列 ID 折叠成一个 ID 列
- extjs - Sencha 开放工具和 Docker
- listview - 在 Flutter 中清除 ListView
- python - 在 ipython 实例之间共享命名空间/环境