我试图根据多列中编码的信息以及索引的相对位置创建一个新列(bool)
我有一个数据帧,它有start
列和end
列,以及许多行。我希望保留不与其他行重叠的行,优先考虑最高的行/第一个观察值(DF已排序)
换句话说,如果一个范围(开始,结束)至少部分包含在一个索引号较低的范围(开始,结束)内,那么它将被分配False
。如果没有发现重叠,将为其分配True
我已经使用for循环实现了这一点,但是这很慢,即使使用大小适中的DFs也是如此。我正在寻找一种更为“pandas-y”的过滤方式,以便在<;=O(n)。这种for-loop方法会删除列(最终是我要做的),而不是创建一个新列,但我认为使用“for-loop-less”方法创建一个新的bool列要容易得多。以下是我用来完成此任务的代码:
import pandas as pd
df=pd.DataFrame(((5,12),(16,19),(7,14),(6,9),(17,18),(1,3)),columns=["start","end"])
dropIndexes=[]
for i in range(len(df) - 1, 0, -1):
start=(df.iloc[i]['start'] >= df.iloc[list(range(0, i))][['start']]).start & (
df.iloc[i]['start'] <= df.iloc[list(range(0, i))][['end']]).end
end =(df.iloc[i]['end'] >= df.iloc[list(range(0, i))][['start']]).start & (
df.iloc[i]['end'] <= df.iloc[list(range(0, i))][['end']]).end
if True in (start|end).values: dropIndexes.append(i)
df=df.drop(dropIndexes)
df
此代码从DF中的“自下而上”开始,分别测试当前行的start
值是否包含在具有较低索引的任何行的start
和end
之间。然后对当前行的end
值重复此操作。然后测试当前start
或end
是否包含在索引范围较低的任何其他行中
假设
start
和end
列没有负值。 您可以将pandas.apply用于您的用例另外,我不得不使用
global
变量,因为我得到了UnboundLocalError
。另外,我不想将start
和end
作为参数传递给数据帧中每一行的apply()
相关问题 更多 >
编程相关推荐