3

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

这是我的数据框对象

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

我正在尝试解析每一行并创建两个列表。列表一应该有所有真实值的列名。列表二应该有假值的列名。

刺激 1 的示例:

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

我知道我可以暴力破解这种方法并遍历行。或者我可以转置并转换为字典并以这种方式解析。我也可以创建稀疏系列对象,然后创建集合,但必须单独引用列名。

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

作为 Pandas 的内置功能,有没有更有效的方法来做到这一点?

谢谢你的帮助。

4

2 回答 2

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
于 2013-09-17T21:29:09.440 回答
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 构造函数。我很确定没有办法解决它。

于 2013-09-17T21:57:51.113 回答