如何在Pandas中满足特定条件的数据框单元格中放置列名

5

I have a dataframe like this:

         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时,该列的名称已被替换,并且所有内容已放入另一个数组中。
我查看了这篇帖子链接,但它没有帮助我,因为名称已经静态更改。
谢谢:)
3个回答

5

使用:

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']]

谢谢你的回答 :) 它在每个数组中显示1,我需要列名而不是1。你有任何想法怎么做吗? - sariii
1
@sariaGoudarzi - 当然,因为你使用stack重新塑形 - 首先创建带有索引值的第一列a,其次是列名的第二列b,最后创建c列的值。 - jezrael
1
好的,当然,请稍等一下。 - jezrael
@sariaGoudarzi - 我对评论没有任何问题 :) 所以现在只添加了通过布尔索引筛选出的值为1 - jezrael
1
不好意思,我的意思是结果不正确。实际上我知道这与这个问题无关,我可以简单地在这6列之间加上“and”来检查它们是否都是NaN,以后我会学习什么是最好的解决方案。感谢您抽出时间,非常感激 :) - sariii
显示剩余10条评论

5

在我看来,“dot”是指点运算符。

df.notnull().dot(df.columns+',').str[:-1].str.split(',').tolist()
Out[753]: [['ADR'], ['EF', 'INF'], ['SSI'], ['WD', 'EF', 'INF'], ['WD']]

3

选项 1
使用replacestackgroupby技术。

df.replace(1.0, df.columns.to_series()).stack().groupby(level=0).apply(list).tolist()

选项2:
应用:

df.apply(lambda x: list(x[x.notnull()].index), 1).values.tolist()

两者都会生成:

[['ADR'], ['EF', 'INF'], ['SSI'], ['WD', 'EF', 'INF'], ['WD']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接