我想获取特定行中包含1的列的列名。
回答:
首先
你的问题非常模糊,我建议你阅读@sammywemmy评论中的这个链接。如果我正确理解了你的问题……我们先讨论这个掩码:
df.columns[ (df == 1) # 掩码 .any(axis=0) # 掩码]
发生了什么?让我们从df.columns[**HERE**]
内部开始逐步向外解释:
(df == 1)
创建了一个布尔掩码,对df
进行True
/False
(1
/0
)标记.any()
根据文档:
“除非系列或数据框轴上至少有一个元素为True或等效值,否则返回False”。
这为我们提供了一个方便的Series
,用于掩码列名。
我们将使用这个例子来为下面的解决方案自动化
接下来:
自动化获取(<行索引> ,[<列名>, <列名>,..])
的输出,其中行值中存在1
。尽管这在大数据集上会较慢,但应该可以解决问题:
import pandas as pddata = {'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 spama 0 0 0 0b 0 1 0 1c 0 0 0 0d 0 0 0 1
# 按索引对df进行分组,并创建一个以df列表为值的字典df_dict = dict( list( df.groupby(df.index) ))
下一步是一个for
循环,迭代df_dict
中每个df的内容,使用我们之前创建的掩码进行检查,并打印预期的结果:
for k, v in df_dict.items(): # k: 索引名称, v: 是一个df check = v.columns[(v == 1).any()] if len(check) > 0: print((k, check.to_list()))
('b', ['bar', 'spam'])('d', ['spam'])
附注:
你看到我如何生成可以轻松复制的样本数据了吗?将来,请尝试提出带有可复制样本数据的问题。这样可以帮助你更好地理解你的问题,也便于我们为你解答。