编辑:为清晰起见,更改了示例df
我有一个 Dataframe ,类似于下面给出的 Dataframe (除了真实的的 Dataframe 有几千行和几千列,值是浮点数):
df = pd.DataFrame([[6,5,4,3,8], [6,5,4,3,6], [1,1,3,9,5], [0,1,2,7,4], [2, 0, 0, 4, 0])
0 1 2 3 4
0 6 5 4 3 8
1 6 5 4 3 6
2 1 1 3 9 5
3 0 1 2 7 4
4 2 0 0 4 0
在这个 Dataframe 中,我想删除所有值都小于或等于任何其他行的所有行。对于这个简单的例子,行1和行3应该被删除(分别由行0和行2“支配"):
filtered df:
0 1 2 3 4
0 6 5 4 3 8
2 1 1 3 9 5
4 2 0 0 4 0
如果该方法可以考虑浮点错误,那就更好了,因为我的真实的 Dataframe 包含浮点数(即不是删除所有值都小于/等于的行,而是值不应该小于一个小数量(例如0.0001))。
我处理这个问题的初步想法如下:
1.选择第一行
1.使用列表解析将其他行与它进行比较(见下文)
1.删除返回True的所有行
1.对下一行重复此操作
列表理解代码:
selected_row = df.loc[0
[(df.loc[r]<=selected_row).all() and (df.loc[r]<selected_row).any() for r in range(len(df))]
[False, True, False, False, False]
然而,这似乎很难有效。任何关于如何(有效)解决这个问题的建议都将非常感谢。
5条答案
按热度按时间yb3bgrhw1#
我们可以尝试使用
broadcasting
:df
:直觉:
通过DataFrame广播比较操作:
一个二个一个一个
然后我们可以检查
axis=2
上的all
:然后我们可以使用
sum
来计算小于或等于以下值的行数:只有1行小于或等于(仅自匹配)的行是要保留的行。因为我们使用
drop_duplicates
,所以 Dataframe 中不会有重复项,因此只有True
值是自匹配值,而那些小于或等于:然后,它将成为DataFrame的筛选器:
df
:sigwle7e2#
主导行的预期比例是多少?您将处理的数据集的大小和可用内存是多少?
虽然像broadcasting approach这样的解决方案非常聪明和高效(矢量化),但它将无法处理大型 Dataframe ,因为广播的大小将迅速突破内存限制(100,000 ×10的输入数组将无法运行在大多数计算机上)。
这里有另一种方法可以避免测试所有的组合,避免在内存中一次性计算所有的东西。由于循环的原因,它比较慢,但是它应该能够处理更大的数组。当支配行的比例增加时,它也会运行得更快。
总的来说,它将数据集与第一行进行比较,删除受支配的行,将第一行移到末尾,然后重新开始,直到完成一个完整的循环。如果随着时间的推移删除了行,则比较的次数会减少。
要删除从属行:
在广播方法无法运行的情况下进行快速基准测试:在大多数行不占优势的情况下,100 k ×10 ~(-1)〈2 min;大多数行占优势时为4s
j5fpnvbx3#
您可以尝试:
输出
| | 无|1个|第二章|三个|四个|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|六个|五个|四个|三个|六个|
| 第二章|1个|1个|三个|九|五个|
dxxyhpgq4#
你可以试试这样的方法:
ie3xauqp5#
下面是使用
df.apply()
的方法输出: