首页 > 解决方案 > 如果列值为 1,则熊猫打印一列应用于所有列

问题描述

我有行和列,其中的列代表实际实体。除了第一列之外的列值是 1 或 0。第一列是键。如果列值为 1,则目标是返回列名(第二列到最后一列)。这是我编写的函数,它可以工作。想知道是否有更好的方式在 Pandas 中表达这一点,或者甚至更好的方式来表示这种形式的数据以使其对 pandas 更友好。

def return_keys(df,productname):
    df2 = df[df['Product']==productname]
    print(df2)
    columns = list(df2)
    cust=[]
    for col in columns[1:]:
        if (df2[col].to_list()[0]==1):
            cust.append(col)
    return cust

标签: pythonpandas

解决方案


如果您的键列不包含 0/1 ,您可以尝试apply按行使用。下面是一个示例数据集:

import pandas as pd
import numpy as np

np.random.seed(111)
df = pd.DataFrame({'Product':np.random.choice(['A','B','C'],10),
'Col1':np.random.binomial(1,0.5,10),
'Col2':np.random.binomial(1,0.5,10),
'Col3':np.random.binomial(1,0.5,10)})

df

  Product  Col1  Col2  Col3
0       A     0     1     1
1       A     1     0     0
2       A     1     1     1
3       A     1     0     0
4       C     1     1     1
5       B     0     1     1
6       C     1     0     0
7       C     0     1     0
8       C     1     1     1
9       A     0     1     0

我们应用一个布尔值并将 (axis=1) 应用到这个布尔值 data.frame 上,调出列。

(df == 1).apply(lambda x:df.columns[x].tolist(),axis=1)

0          [Col2, Col3]
1                [Col1]
2    [Col1, Col2, Col3]
3                [Col1]
4    [Col1, Col2, Col3]
5          [Col2, Col3]
6                [Col1]
7                [Col2]
8    [Col1, Col2, Col3]
9                [Col2]

推荐阅读