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

VIB*_*YAL 1 python machine-learning python-3.x pandas

我有一个如下的数据框: 在此处输入图片说明

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

例如

For Row 1: Blanks,
For Row 2: Manufacturing,
For Row 3: Manufacturing,
For Row 4: Manufacturing,
For Row 5: Social, Finance, Analytics, Advertising,
Run Code Online (Sandbox Code Playgroud)

现在我只能得到完整的行:

primary_sectors = lambda primary_sector: sectors[
    sectors["category_list"] == primary_sector
]
Run Code Online (Sandbox Code Playgroud)

请帮我获取上述数据框中列的名称。

我试过这个代码:

primary_sectors("3D").filter(items=["0"])
Run Code Online (Sandbox Code Playgroud)

它给了我输出,1但我需要输出Manufacturing

jez*_*ael 5

使用DataFrame.dot

df1 = df.dot(df.columns)
Run Code Online (Sandbox Code Playgroud)

如果1每行有多个:

df2 = df.dot(df.columns + ';').str.rstrip(';')
Run Code Online (Sandbox Code Playgroud)


Ukr*_*rge 4

首先

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

df.columns[      
    (df == 1)        # mask 
    .any(axis=0)     # mask
]
Run Code Online (Sandbox Code Playgroud)

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

  1. (df == 1)df使用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
Run Code Online (Sandbox Code Playgroud)
# group our df by index and creates a dict with lists of df's as values
df_dict = dict(
    list(
        df.groupby(df.index)
    )
)
Run Code Online (Sandbox Code Playgroud)

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

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()))
Run Code Online (Sandbox Code Playgroud)
('b', ['bar', 'spam'])
('d', ['spam'])
Run Code Online (Sandbox Code Playgroud)

边注:

您看到我如何生成可以轻松复制的示例数据了吗?今后,请尝试使用已发布的可重现的示例数据提出问题。这样可以帮助您更好地理解您的问题,我们也更容易为您解答。