在Pandas中筛选值为1的列名并新增category列的技术问询
如何在Pandas中新增
category列并筛选值为1的列名? 没问题,我来帮你搞定这两个Pandas操作!先假设你的DataFrame是类似这样的结构(方便后续演示):
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'A': [0, 1, 0, 1], 'B': [1, 0, 0, 1], 'C': [0, 0, 1, 0] })
1. 新增名为category的列
这部分要分两种情况处理,取决于你的数据里每行有几个值为1的列:
情况1:每行恰好只有一个值为1的列
如果你的数据保证每行只有一列是1,那用idxmax方法最简洁高效:
df['category'] = df.eq(1).idxmax(axis=1)
原理很简单:df.eq(1)会把所有等于1的位置转为True,其他为False;idxmax(axis=1)则会取每行第一个True对应的列名——刚好就是你要的那个值为1的列名。
情况2:每行可能有多个值为1的列
如果一行里有多个列值为1,想要把这些列名拼接成字符串(比如用逗号分隔),就用apply配合lambda表达式:
df['category'] = df.apply(lambda row: ', '.join(row[row == 1].index), axis=1)
这里row[row == 1]会筛选出当前行值为1的所有元素,.index拿到这些元素对应的列名,最后用join把列名拼接成一个字符串。
2. 筛选值为1的列名
这里要分两种常见场景,你可以根据自己的需求选择:
- 筛选至少包含一个1的列:
如果你想找出所有存在1的列,用这个代码:
cols_with_at_least_one = df.columns[df.eq(1).any(axis=0)]
df.eq(1).any(axis=0)会检查每列是否有至少一个True(也就是至少有一个1),然后用这个布尔数组去筛选出对应的列名。
- 筛选所有行值都是1的列:
如果要找那些每行都是1的列,就用all代替any:
cols_all_one = df.columns[df.eq(1).all(axis=0)]
all(axis=0)会验证每列的所有行是否都是True(也就是全为1),再筛选出符合条件的列名。
内容的提问来源于stack exchange,提问作者Ganapati
相关产品推荐
相关产品推荐

