首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据pandas中的条件获取列名

根据pandas中的条件获取列名
EN

Stack Overflow用户
提问于 2020-03-01 13:11:54
回答 3查看 9.4K关注 0票数 1

我有一个如下的数据框架:

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

例如:

代码语言:javascript
复制
For Row 1: Blanks,
For Row 2: Manufacturing,
For Row 3: Manufacturing,
For Row 4: Manufacturing,
For Row 5: Social, Finance, Analytics, Advertising,

现在,我只能获得完整的行:

代码语言:javascript
复制
primary_sectors = lambda primary_sector: sectors[
    sectors["category_list"] == primary_sector
]

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

我试过这段代码:

代码语言:javascript
复制
primary_sectors("3D").filter(items=["0"])

它给我的输出为1,但我需要输出为Manufacturing

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-01 14:08:18

首先

你的问题非常模棱两可,我建议你在@sammywemmy的评论中阅读这个link。如果我没弄错你的问题..。我们将首先讨论这个掩码:

代码语言:javascript
复制
df.columns[      
    (df == 1)        # mask 
    .any(axis=0)     # mask
]

发生什么事了呢?让我们从df.columns[**HERE**]内部开始向外学习:

根据docs

  1. (df == 1)使用True/False(1/0)
  2. .any()df进行布尔掩码

“返回False,除非在一个序列中或沿着数据框轴至少有一个元素是True或等效的”。

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

我们将使用此示例在下自动执行您的解决方案

接下来:

Automate,以获得行值中包含1(<row index> ,[<col name>, <col name>,..])的输出。虽然这在大型数据集上会更慢,但它应该可以做到:

代码语言:javascript
复制
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
代码语言:javascript
复制
# 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的内容,用我们之前创建的掩码检查它们,并打印预期的结果:

代码语言:javascript
复制
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()))
代码语言:javascript
复制
('b', ['bar', 'spam'])
('d', ['spam'])

附注:

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

票数 4
EN

Stack Overflow用户

发布于 2020-03-01 14:19:53

使用DataFrame.dot

代码语言:javascript
复制
df1 = df.dot(df.columns)

如果每行有多个1

代码语言:javascript
复制
df2 = df.dot(df.columns + ';').str.rstrip(';')
票数 9
EN

Stack Overflow用户

发布于 2021-06-26 22:48:12

获取列名分为两部分。

如果你想要一个新的列名,那么条件应该是唯一的,因为它只为每一行提供一个列名。

代码语言:javascript
复制
data = {'foo':[0,0,3,0], 'bar':[0, 5, 0, 0], 'baz':[0,0,2,0], 'spam':[0,1,0,1]}
df = pd.DataFrame(data)
df=df.replace(0,np.nan)
df
    foo bar baz spam
0   NaN NaN NaN NaN
1   NaN 5.0 NaN 1.0
2   3.0 NaN 2.0 NaN
3   NaN NaN NaN 1.0

如果您正在寻找最小值或最大值

代码语言:javascript
复制
max= df.idxmax(1)
min = df.idxmin(1)
out=  df.assign(max=max , min=min)
out

    foo bar baz spam   max    min
0   NaN NaN NaN NaN    NaN    NaN
1   NaN 5.0 NaN 1.0    bar    spam
2   3.0 NaN 2.0 NaN    foo    baz
3   NaN NaN NaN 1.0    spam   spam

第二种情况,如果您的条件在多个列中得到满足,例如,您正在查找包含1的列,并且您正在查找列表,因为不可能在相同的数据帧中进行调整。

代码语言:javascript
复制
str_con= df.astype(str).apply(lambda x:x.str.contains('1.0',case=False, na=False)).any()
df.column[str_con]
#output
Index(['spam'], dtype='object') #only spam contains 1

或者您正在查找数值条件列包含的值大于1

代码语言:javascript
复制
num_con = df.apply(lambda x:x>1.0).any()
df.columns[num_con]
#output
Index(['foo', 'bar', 'baz'], dtype='object') #these col has higher value than 1

快乐学习

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60472196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档