Python 根据另一数据帧中的数据量删除数据帧中的行

Python 根据另一数据帧中的数据量删除数据帧中的行,python,pandas,Python,Pandas,我有两个熊猫数据帧A和BB是a的子集 我想删除A中的所有数字,如果它在B中。但是,如果一个数字在A中出现两次,在B中出现一次,那么它只会删除A中出现的一个数字 以下是我的示例数据集: df_A df_B [Test] [Test] 1 1 2 2 3 5 2 5 4 5 5

我有两个熊猫数据帧
A
B
<代码>B是a的子集

我想删除A中的所有数字,如果它在B中。但是,如果一个数字在A中出现两次,在B中出现一次,那么它只会删除A中出现的一个数字

以下是我的示例数据集:

df_A                df_B
[Test]              [Test]
1                   1
2                   2         
3                   5 
2                   5 
4
5
5
在操作之后,我想要新的数据帧c作为

df_C
[Test]
3
2
4
你能建议怎么做吗


如果出现在
B
中,则删除
A
中的所有引用,而不仅仅是前N个引用。

如果创建一些包含每个值的引用号的中间值,则可以使用创建要排除的数据帧行的逻辑索引,如:

代码: 测试代码: 结果: 我可能会做些什么(窃取SR的设置):

这让我

In [121]: dfC
Out[121]: 
   A
2  3
3  2
4  4

这是通过使用groupby来获取以前在中看到给定值的次数:

In [124]: dfA.groupby('A').cumcount()
Out[124]: 
0    0
1    0
2    0
3    1
4    0
5    0
6    1
dtype: int64
并使用
value\u counts
获得限值,然后重新索引以匹配计数:

In [139]: dfB['B'].value_counts()
Out[139]: 
5    2
2    1
1    1
Name: B, dtype: int64

In [140]: dfB['B'].value_counts().reindex(dfA.A)
Out[140]: 
A
1    1.0
2    1.0
3    NaN
2    1.0
4    NaN
5    2.0
5    2.0
Name: B, dtype: float64

在这个问题中,您可以使用和。对于drop,您需要知道要丢弃的行的索引

import itertools
from collections import Counter
df = pd.DataFrame({'Test': {0: 1, 1: 2, 2: 3, 3: 2, 4: 4, 5: 5, 6: 5}})
df2 = pd.DataFrame({'Test': {0: 1, 1: 2, 2: 5, 3: 5}})
c_df2 = Counter(df2.Test)

indexes_to_remove_2d = [df.index[df['Test'] == k].tolist()[:v] 
                        for k, v in c_df2.items()]
# [[0], [1], [5, 6]]
merged = list(itertools.chain(*indexes_to_remove_2d))
# [0, 1, 5, 6]
df.drop(merged)

    Test
2   3
3   2
4   4
索引\u 2d
生成与计数器中的值
k
相匹配的索引,该值具有
df.index[df['Test']==k]
,并具有一个
[:v]
来限制我们从中获取的索引的大小

然后,我们将这些
索引
itertools.chain
合并。最后,删除带有这些索引的行


感谢Stephan Ranch指出订单问题。

可能的重复不是重复,因为问题要求只删除前N个实例。@Stephernauch这是真的!我将强调这一点。
In [121]: dfC
Out[121]: 
   A
2  3
3  2
4  4
In [124]: dfA.groupby('A').cumcount()
Out[124]: 
0    0
1    0
2    0
3    1
4    0
5    0
6    1
dtype: int64
In [139]: dfB['B'].value_counts()
Out[139]: 
5    2
2    1
1    1
Name: B, dtype: int64

In [140]: dfB['B'].value_counts().reindex(dfA.A)
Out[140]: 
A
1    1.0
2    1.0
3    NaN
2    1.0
4    NaN
5    2.0
5    2.0
Name: B, dtype: float64
import itertools
from collections import Counter
df = pd.DataFrame({'Test': {0: 1, 1: 2, 2: 3, 3: 2, 4: 4, 5: 5, 6: 5}})
df2 = pd.DataFrame({'Test': {0: 1, 1: 2, 2: 5, 3: 5}})
c_df2 = Counter(df2.Test)

indexes_to_remove_2d = [df.index[df['Test'] == k].tolist()[:v] 
                        for k, v in c_df2.items()]
# [[0], [1], [5, 6]]
merged = list(itertools.chain(*indexes_to_remove_2d))
# [0, 1, 5, 6]
df.drop(merged)

    Test
2   3
3   2
4   4