使用 Pandas 数据框的列名构建列表

3

我将要处理一组相当大的数据。我使用Pandas DataFrame来处理这些数据,目前卡在了一种有效地将数据解析成两个格式化列表的方法上。

以下是我的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内置功能来执行此操作?
谢谢你的帮助。

2
你实际上想做什么?我认为这不是做任何事情的好方法... - Andy Hayden
我正在尝试构建一个功能信息列表,以便创建一个篮子文件,以供Orange关联规则学习器解析器使用。因此,该文件必须如下所示。 - user2479059
fet1,fet2,fet3,fet4,tag - user2479059
一系列的列表不太常用,也不是很有用,但在这种特定情况下似乎是你需要的。请查看我的答案,了解第二种可能性。 - Dan Allan
2个回答

2

Is this what you want?

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

这仍然是逐行基础。我知道有一种使用内置API的方法,但我对PANDAS还不熟悉。谢谢你的帮助。我之所以需要这样解析,是因为在此步骤之前我必须进行广泛的过滤,而DataFrame帮助我快速解析了所有内容。再次感谢。 - user2479059
这使我得到了O(n)的解析。 - user2479059

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构造函数。不过我相信没有绕过它的办法。


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