python - 用 1 替换不同列中的多个不同字符串,并用 pandas 中的计数改变一个新列
问题描述
我用这个问题在 R 中做了这个,但是切换到 Python 并且仍然没有看到一个好的答案。
我有一个包含 200 列不同字符串和数字的数据框。
例子:
Name Gender Disease1 Disease2 Disease3
Joe Male disease1 NA disease3
Ben Male NA disease2 NA
Chloe Female disease1 disease2 NA
如何将Disease
多列中的不同值转换为 1,然后改变一个新列,计算特定列中 1 的总数(可能在 22:65 列中)。
期望的输出
Name Gender Disease1 Disease2 Disease3 Total_diseases
Joe Male disease1 NA disease3 2
Ben Male NA disease2 NA 1
Chloe Female disease1 disease2 NA 2
我想要一个新列Total_diseases
,其中汇总了所有文本值(现在转换为 1)。因此,如果一个人患有 10 种疾病,它就会出现在这个变异的列中。希望它能回答你的问题。
解决方案
您可以设置 index onid
然后使用notna()
以使这些条目不为 null 并将它们更改为 1 .astype(int)
。然后按每行的计数过滤Disease*
列:.filter()
sum
axis=1
df_out = df.set_index('id').notna().astype(int).reset_index()
df_out['Total_diseases'] = df_out.filter(like='Disease').sum(axis=1)
结果
print(df_out)
id Disease1 Disease2 Disease3 Total_diseases
0 1 1 0 1 2
1 2 0 1 0 1
2 3 1 1 0 2
编辑:
如果您想按数字指定列的范围,您可以使用.iloc
例如 use df_out.iloc[:, 10:30]
和 usedf_out.iloc[:, 10:30].sum(axis=1)
来对这些列求和。
编辑 2
根据更新的样本输入和所需的输出,并且您提到您希望通过列号引用列的范围,而不是像上面的解决方案中过滤类似的列标签(可能真正的疾病名称没有共同的模式),您可以改为使用.iloc
,如下所示:
df['Total_diseases'] = df.iloc[:, 2:5].notna().sum(axis=1)
结果
print(df)
Name Gender Disease1 Disease2 Disease3 Total_diseases
0 Joe Male disease1 NaN disease3 2
1 Ben Male NaN disease2 NaN 1
2 Chloe Female disease1 disease2 NaN 2
推荐阅读
- netlogo - 比较 netlogo 中的坐标时应该使用哪个原语?
- javascript - 如何在 React 中一次拖动多个对象?
- python - 安装nodejs问题
- vue.js - Vuejs如何在单个组件中使用重复方法
- c - 为什么在 C 中声明函数参数之前使用“const *”?
- swift - 如何更新不同视图控制器中的标签?
- azure - 创建流式定位器时在 Azure 媒体服务上出现间歇性错误
- javascript - 发布 Chrome 扩展程序的问题
- javascript - DataTables ajax 高级搜索
- python - 两个数组之间的 Python/Numpy 广播连接