Python 从与另一个数据帧重叠的数据帧中删除行

Python 从与另一个数据帧重叠的数据帧中删除行,python,pandas,dataframe,drop,Python,Pandas,Dataframe,Drop,我有第一个数据帧: df1 = pd.DataFrame({'subject':[1,4,8,1,2,6,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,2,3,4,5,8,9,10], 'trial':[1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3]}) print(df1) subject trial 0 1

我有第一个数据帧:

df1 = pd.DataFrame({'subject':[1,4,8,1,2,6,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,2,3,4,5,8,9,10], 
                    'trial':[1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3]}) 

print(df1)

    subject  trial
0         1      1
1         4      1
2         8      1
3         1      2
4         2      2
5         6      2
6         9      2
7        11      2
8        12      2
9        13      2
10       14      2
11       15      2
12       16      2
13       17      2
14       18      2
15       19      2
16       20      2
17       21      2
18       22      2
19       23      2
20       24      2
21        2      3
22        3      3
23        4      3
24        5      3
25        8      3
26        9      3
27       10      3
以及第二数据帧:

df2 = pd.DataFrame({'subject':[2,3], 
                    'trial':[12,4]})   

print(df2)

   subject  trial
0        2     12
1        3      4
我想删除受试者2在试验12之前的所有试验(受试者2的试验1,4,8,1,2,6,9,11,12),以及受试者3在试验4之前的所有试验(受试者3的试验2,3,4)

是否可以通过比较两个数据帧或使用字典中的映射和删除来执行此操作?

使用操作
  • groupby('subject')
    agg(set)
    to
    trial
  • 。连接两个数据帧
  • 使用
    范围(x+1)
    创建一组
    试验,因为目标是删除所有以前的试验
  • 取两个
    集合的
  • 如果需要,将结果转换回
    列表
    分解
    • explode
      可从pandas 0.25获得
  • 将熊猫作为pd导入
    #资料
    df1=pd.数据帧({'subject':[1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3],
    ‘审判’:[1,4,8,1,2,6,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,2,3,4,5,8,9,10])
    df2=pd.DataFrame({'subject':[2,3],
    “审判”:[12,4]})
    #将主题设置为df2中的索引
    df2.set_索引('subject',in place=True)
    #对于df1 groupby受试者和agg受试者
    df1g=pd.DataFrame(df1.groupby('subject')['trial'].agg(set))
    |受试者|审判|
    |----------:|:---------------------------------------------------------------------|
    |         1 | {8, 1, 4}                                                            |
    |         2 | {1, 2, 6, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24} |
    |         3 | {2, 3, 4, 5, 8, 9, 10}                                               |
    #加入数据帧
    df_join=df1g.join(df2,rsuffix=''n')
    |受试者|审判|审判||
    |----------:|:---------------------------------------------------------------------|----------:|
    |1{8,1,4}南|
    |         2 | {1, 2, 6, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24} |        12 |
    |         3 | {2, 3, 4, 5, 8, 9, 10}                                               |         4 |
    #这是必需的,因为集合和范围不适用于nan
    df_join.trial_n.fillna(0,inplace=True)
    #将试用版转换为一套;int是必需的,因为范围不适用于float
    df_join.trial_n=df_join.trial_n.apply(lambda x:set(范围(int(x)+1)))
    #以设定的差异为准
    df_join['resists']=df_join.trial-df_join.trial\n
    |主体|审判|审判|仍然存在|
    |----------:|:---------------------------------------------------------------------|:-------------------------------------------|:-------------------------------------------------|
    |         1 | {8, 1, 4}                                                            | {0}                                        | {8, 1, 4}                                        |
    |         2 | {1, 2, 6, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24} | {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} | {13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24} |
    |         3 | {2, 3, 4, 5, 8, 9, 10}                                               | {0, 1, 2, 3, 4}                            | {8, 9, 10, 5}                                    |
    #创建df_final&将剩余部分转换回列表,以便使用explode
    df_final=pd.DataFrame(df_join.rements.map(列表).map(排序))
    |受试者遗骸|
    |----------:|:-------------------------------------------------|
    |         1 | [1, 4, 8]                                        |
    |         2 | [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] |
    |         3 | [5, 8, 9, 10]                                    |
    #分解列表
    df_final=df_final.explode('残留')
    |受试者遗骸|
    |----------:|----------:|
    |         1 |         1 |
    |         1 |         4 |
    |         1 |         8 |
    |         2 |        13 |
    |         2 |        14 |
    |         2 |        15 |
    |         2 |        16 |
    |         2 |        17 |
    |         2 |        18 |
    |         2 |        19 |
    |         2 |        20 |
    |         2 |        21 |
    |         2 |        22 |
    |         2 |        23 |
    |         2 |        24 |
    |         3 |         5 |
    |         3 |         8 |
    |         3 |         9 |
    |         3 |        10 |
    
    df2的名字看起来像是你在第二次df中交换了试验和主题?