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
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)
您的问题非常模糊,我建议您阅读@sammywemmy 评论中的此链接。如果我正确理解你的问题......我们将首先讨论这个面具:
df.columns[
(df == 1) # mask
.any(axis=0) # mask
]
Run Code Online (Sandbox Code Playgroud)
发生了什么?让我们从内部开始向外努力df.columns[**HERE**]:
(df == 1)df使用True/ False( 1/ 0)创建布尔掩码.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)
您看到我如何生成可以轻松复制的示例数据了吗?今后,请尝试使用已发布的可重现的示例数据提出问题。这样可以帮助您更好地理解您的问题,我们也更容易为您解答。
| 归档时间: |
|
| 查看次数: |
7627 次 |
| 最近记录: |