[英]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.