如果特定行的列在该列中包含1,我想获取该列的名称。
例如
For Row 1: Blanks,
For Row 2: Manufacturing,
For Row 3: Manufacturing,
For Row 4: Manufacturing,
For Row 5: Social, Finance, Analytics, Advertising,
现在我只能获得完整的行:
primary_sectors = lambda primary_sector: sectors[
sectors["category_list"] == primary_sector
]
请帮助我获取上述数据框中的列名。
我尝试了以下代码:
primary_sectors("3D").filter(items=["0"])
它给我的输出为1
,但我需要输出为Manufacturing
答案 0 :(得分:3)
尽管您的问题非常模棱两可,但我建议阅读@sammywemmy的评论中的link。如果我正确理解了您的问题,我们将首先讨论这个面具:
df.columns[
(df == 1) # mask
.any(axis=0) # mask
]
发生了什么事?让我们从df.columns[**HERE**]
开始向外工作:
(df == 1)
用df
/ True
(False
,1
)组成0
的布尔掩码.any()
:“除非在系列中或沿着数据框轴为True或等效的元素中至少存在一个元素,否则返回False”。这为我们提供了方便的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'])
您看到我如何生成可以轻松复制的样本数据吗?将来,请尝试对发布的示例数据提出问题,以进行复制。这样可以帮助您更好地了解您的问题,并且我们可以更轻松地为您解决问题。
答案 1 :(得分:2)
答案 2 :(得分:1)
获取列名分为 2 个部分。
如果你想要一个新的列名,那么条件应该是唯一的,因为它只会为每一行提供 1 个列名。
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
如果您正在寻找最小值或最大值
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 的列,而您正在寻找列表,因为它不可能在同一数据帧中进行调整。
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
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
快乐学习