在熊猫中获取等于给定行值的列名

时间:2020-08-03 16:35:21

标签: pandas

我有一张这样的桌子:

  Scen  F1  F2  F3  F4
0   S1   1   0   1   0
1   S2   0   1   0   1

,并希望按Scen搜索并返回该行的== 1列名称,例如对于S1,我需要F1, F3作为结果。

我已经尝试了以下方法,并且可以通过硬编码df_col[0]来获得结果,但是需要能够动态地做到这一点。

执行此操作的最佳方法是什么?

import pandas as pd

d = {'Scen': ["S1", "S2"],
     'F1': [1, 0],
     'F2': [0, 1],
     'F3': [1, 0],
     'F4': [0, 1]
    }
df = pd.DataFrame(data=d)

def get_features(df, col_name):
    df_col = df[(df.Scen == col_name)].T
    feats = (df_col[(df_col[0] == 1)]).index.to_list()

    print(feats)
    return feats

get_features(df, "S1")
get_features(df, "S2")

编辑:

基于RichieV的答案,这可行:

def get_features(df, col_name):
    df = df.replace(0, np.nan)
    df = df.melt('Scen')
    df_scen = (df['variable'].loc[(df['Scen']==col_name) & (df['value']==1)])
    return (list(df_scen))

2 个答案:

答案 0 :(得分:1)

这是一次热解码操作。当您编码为一个时,您将旋转一列,所以现在我们需要将其融化。

df = df.replace(0, np.nan) # get rid of zeros, they only fill spaces
df = df.melt('Scen').drop('value', axis=1)

现在df具有四行和两列(场景和变量),每个对应的要素都有重复的场景行。您可以按原样使用df或按方案分组并在列表中收集功能。

df = df.groupby('Scen').apply(list)

答案 1 :(得分:0)

这行得通,但不确定效率最高

import pandas as pd

d = {'Scen': ["S1", "S2"],
     'F1': [1, 0],
     'F2': [0, 1],
     'F3': [1, 0],
     'F4': [0, 1]
    }
df = pd.DataFrame(data=d)

def get_features(df, col_name):
    df_col = df[(df.Scen == col_name)].T
    df_feats = df_col.loc[df_col[df_col.columns.values[0]] == 1]
    return (list(df_feats.index))

s1_list = get_features(df, "S1")
s2_list = get_features(df, "S2")
print(s1_list)
print(s2_list)
['F1', 'F3']
['F2', 'F4']
相关问题