我有一个这样的数据框:
ADR WD EF INF SSI DI
0 1.0 NaN NaN NaN NaN NaN
1 NaN NaN 1 1 NaN NaN
2 NaN NaN NaN NaN 1 NaN
3 NaN 1 1 1 NaN NaN
4 NaN 1.0 NaN NaN NaN NaN
我希望结果是这样的:
[["ADR"],["EF","INF"],["SSI"],["WD","EF","INF"],["WD"]]
如您所见,如果该列中有1
,则该列的名称已被替换。并且所有内容都放在另一个数组中。
我看过这篇文章link,但由于名称已经发生了静态变化,所以对我没有帮助。
谢谢:)
答案 0 :(得分:5)
IIUC dot
df.notnull().dot(df.columns+',').str[:-1].str.split(',').tolist()
Out[753]: [['ADR'], ['EF', 'INF'], ['SSI'], ['WD', 'EF', 'INF'], ['WD']]
答案 1 :(得分:4)
使用:
df1 = df.stack().reset_index()
df1.columns = ['a','b','c']
df1 = df1[df1['c'] == 1]
a = df1.groupby('a')['b'].apply(list).tolist()
print (a)
[['ADR'], ['EF', 'INF'], ['SSI'], ['WD', 'EF', 'INF'], ['WD']]
答案 2 :(得分:3)
选项1 :
replace
, stack
和 groupby
df.replace(1.0, df.columns.to_series()).stack().groupby(level=0).apply(list).tolist()
选项2 :
apply
:
df.apply(lambda x: list(x[x.notnull()].index), 1).values.tolist()
两种产品:
[['ADR'], ['EF', 'INF'], ['SSI'], ['WD', 'EF', 'INF'], ['WD']]