所以我在一组相当大的数据上运行。我使用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的内置功能,有更有效的方法吗?
感谢您的帮助。
答案 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构造函数。我很确定没有办法绕过它。