【问题标题】:how to put column name into data frame cell with specific conditions in pandas如何在熊猫中将列名放入具有特定条件的数据框单元格中
【发布时间】:2019-01-16 10:08:44
【问题描述】:

我有一个这样的数据框:

         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,但它对我没有帮助,因为名称已静态更改。

谢谢:)

【问题讨论】:

    标签: python pandas dataframe data-analysis


    【解决方案1】:

    用途:

    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。您知道该怎么做吗?
    • @sariaGoudarzi - 给我一秒钟。
    • @sariaGoudarzi - 当然,因为您通过stack 重塑 - 使用索引值创建第一列a,使用列名称创建第二列b,并使用值创建c 列。
    • 是的,当然,等一下。
    • 不,我的意思是结果不正确。其实我知道它与这个问题无关,我可以简单地在这6列之间放置并检查它们是否都是NaN,稍后我将学习什么是最好的解决方案。感谢您抽出宝贵的时间欣赏它:)
    【解决方案2】:

    选项 1
    replacestack@987654323 @

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

    【讨论】:

      【解决方案3】:

      IIUCdot

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-16
        • 2015-10-10
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        相关资源
        最近更新 更多