繁体   English   中英

从列名Pandas DataFrame构建列表

[英]Build list from column names Pandas DataFrame

所以我在一组相当大的数据上运行。 我使用Pandas DataFrame来处理这些数据,并坚持以有效的方式将数据解析为两个格式化的列表

这是我的数据框对象

            fet1    fet2    fet3    fet4    fet5
stim1       True    True    False   False   False
stim2       True    False   False   False   True
stim3       ...................................
stim4       ...................................
stim5       ............................. so on

我试图解析每一行并创建两个列表。 列表一应该具有所有真值的列名。 列表2应该具有false值的列名。

刺激1的例子:

list_1=[fet1,fet2]   
list_2=[fet3,fet4,fet5]

我知道我可以强行采用这种方法并对行进行迭代。 或者我可以转置并转换为字典并解析那个方式。 我也可以创建稀疏系列对象,然后创建集,但必须分别引用列名。

我遇到的唯一问题是我总是得到二次O(n ^ 2)运行时间。

作为Pandas的内置功能,有更有效的方法吗?

谢谢你的帮助。

这是你想要的吗?

>>> df
       fet1   fet2   fet3   fet4   fet5
stim1  True   True  False  False  False
stim2  True   False False  False   True
>>> def func(row):
        return [
            row.index[row == True], 
            row.index[row == False]
        ]
>>> df.apply(func, axis=1)
stim1    [[fet1, fet2], [fet3, fet4, fet5]]
stim2    [[fet1, fet5], [fet2, fet3, fet4]]
dtype: object

这可能会更快,也可能不会更快。 我认为不可能有更简洁的解决方案。

快速(不是逐行)操作可以实现这一目标。

In [126]: (np.array(df.columns)*~df)[~df]
Out[126]: 
      fet1  fet2  fet3  fet4  fet5
stim1  NaN   NaN  fet3  fet4  fet5
stim2  NaN  fet2  fet3  fet4   NaN

但此时,由于行可能具有可变长度,因此必须断开数组结构,并且必须单独考虑每一行。

In [122]: (np.array(df.columns)*df)[df].apply(lambda x: Series([x.dropna()]), 1)
Out[122]: 
                  0
stim1  [fet1, fet2]
stim2  [fet1, fet5]

In [125]: (np.array(df.columns)*~df)[~df].apply(lambda x: Series([x.dropna()]), 1)
Out[125]: 
                    0
stim1  [fet3, fet4, fet5]
stim2  [fet2, fet3, fet4]

最慢的步骤可能是Series构造函数。 我很确定没有办法绕过它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM