从列名Pandas DataFrame构建列表

时间:2013-09-17 21:19:07

标签: python parsing 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应该具有错误值的列名。

刺激1的例子:

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

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

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是你想要的吗?

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

答案 1 :(得分:0)

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

快速(不是逐行)操作可以做到这一点。

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构造函数。我很确定没有办法绕过它。