根据熊猫中的条件获取列名

新手上路,请多包涵

我有一个数据框如下: 在此处输入图像描述

如果特定行的列在该列中包含 1,我想获取该列的名称。

原文由 VIBHOR GOYAL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 324
2 个回答

首先

您的问题非常模棱两可,我建议阅读@sammywemmy 评论中的此 链接。如果我正确理解你的问题……我们将首先讨论这个面具:

 df.columns[
    (df == 1)        # mask
    .any(axis=0)     # mask
]

发生了什么?让我们从内部开始向外工作 df.columns[**HERE**]

  1. (df == 1) makes a boolean mask of the df with True / False ( 1 / 0 )
  2. .any() 根据 文档

“返回 False,除非在一系列中或沿 Dataframe 轴至少有一个元素为 True 或等效”。

这给了我们一个方便的 Series 来屏蔽列名。

我们将使用此示例在下面为您的解决方案自动化


下一个:

自动获取 (<row index> ,[<col name>, <col name>,..]) 的输出,其中 1 在行值中。虽然这在大型数据集上会变慢,但它应该可以解决问题:

 import pandas as pd

data = {'foo':[0,0,0,0], 'bar':[0, 1, 0, 0], 'baz':[0,0,0,0], 'spam':[0,1,0,1]}
df = pd.DataFrame(data, index=['a','b','c','d'])

print(df)

   foo  bar  baz  spam
a    0    0    0     0
b    0    1    0     1
c    0    0    0     0
d    0    0    0     1

 # group our df by index and creates a dict with lists of df's as values
df_dict = dict(
    list(
        df.groupby(df.index)
    )
)

下一步是 for 循环,迭代 df_dict 中每个 df 的内容,使用我们之前创建的掩码检查它们,并打印预期结果:

 for k, v in df_dict.items():               # k: name of index, v: is a df
    check = v.columns[(v == 1).any()]
    if len(check) > 0:
        print((k, check.to_list()))

 ('b', ['bar', 'spam'])
('d', ['spam'])

边注:

您看到我如何生成可以轻松复制的样本数据了吗?以后请尽量用张贴的可以复现的样例数据提问。这样可以帮助您更好地了解您的问题,我们也可以更轻松地为您解答。

原文由 Ukrainian-serge 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 DataFrame.dot

 df1 = df.dot(df.columns)

如果每行有多个 1

 df2 = df.dot(df.columns + ';').str.rstrip(';')

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题