我有一张这样的桌子:
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))
答案 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']