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)
totrial
。连接两个数据帧
范围(x+1)
创建一组试验,因为目标是删除所有以前的试验
集合的差
列表
和分解
。
可从pandas 0.25获得explode
将熊猫作为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中交换了试验和主题?