首页 > 解决方案 > 用 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 种疾病,它就会出现在这个变异的列中。希望它能回答你的问题。

标签: pythonpandasreplace

解决方案


您可以设置 index onid然后使用notna()以使这些条目不为 null 并将它们更改为 1 .astype(int)。然后按每行的计数过滤Disease*列:.filter()sumaxis=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

推荐阅读