Python 从作为第一个数据帧的筛选子集的另一个数据帧中删除数据帧

Python 从作为第一个数据帧的筛选子集的另一个数据帧中删除数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我正在努力解决以下问题: 假设我有以下输入数据帧: df something library other_info FOO NaN blaa BAR ['bar/libBAR.a', 'bar/libBAR.cpp.so', 'bar/libBAR

我正在努力解决以下问题:

假设我有以下输入数据帧:

df
something library                                                     other_info
FOO       NaN                                                         blaa      
BAR       ['bar/libBAR.a', 'bar/libBAR.cpp.so', 'bar/libBARFIGHT.so'] bluu          
MEH       ['meh/libMEH.a', 'meh/libMEH.so', 'meh/libMEH.other.so']    blqq      
regex = '.*/lib.*\.a'
df2 = df1[df1.library.str.contains(regex, regex=True, na=False)]

something library      other_info
BAR       bar/libBAR.a bluu
MEH       meh/libMEH.a blqq
d1.drop(d1[condition].index, inplace=True)
然后,使用
分解
数据帧功能:

df1 = df.explode('library')

something library             other_info
FOO       NaN                 blaa      
BAR       bar/libBAR.a        bluu     
BAR       bar/libBAR.cpp.so   bluu      
BAR       bar/libBARFIGHT.so  bluu      
MEH       meh/libMEH.a        blqq      
MEH       meh/libMEH.so       blqq
MEH       meh/libMEH.other.so blqq
之后,我将使用正则表达式应用筛选,以创建子集数据帧:

df
something library                                                     other_info
FOO       NaN                                                         blaa      
BAR       ['bar/libBAR.a', 'bar/libBAR.cpp.so', 'bar/libBARFIGHT.so'] bluu          
MEH       ['meh/libMEH.a', 'meh/libMEH.so', 'meh/libMEH.other.so']    blqq      
regex = '.*/lib.*\.a'
df2 = df1[df1.library.str.contains(regex, regex=True, na=False)]

something library      other_info
BAR       bar/libBAR.a bluu
MEH       meh/libMEH.a blqq
d1.drop(d1[condition].index, inplace=True)
因此,现在我正试图删除使用“条件”从df1筛选的条目:

创建条件(真/假系列)

在这种情况下,我试图从d1中删除我想要的条目(不创建新的dataframe):

但结果却令人惊讶:

something library             other_info
FOO       NaN                 blaa  
因此,BAR和MEH的所有条目都已从数据帧中删除,即使每个“某物”只匹配一行


我做错了什么?什么是只过滤“True”行的正确方法?是否可以使用“filter”方法进行过滤?

您可以只过滤
而不过滤条件
,就像这样

df3 = df1[~condition]
df3
产生


    something   library             other_info
0   FOO         NaN                 blaa
1   BAR         bar/libBAR.cpp.so   bluu
1   BAR         bar/libBARFIGHT.so  bluu
2   MEH         meh/libMEH.so       blqq
2   MEH         meh/libMEH.other.so blqq
这对你有用吗

如果您更新
explode
语句,则原始代码将正常工作,如下所示:

df1 = df.explode('library', ignore_index = True)

这将重新索引数据帧,这意味着您随后的操作使用唯一的索引值,而不是原始索引值(对于从同一行分解的行重复这些值)

df1[~condition]按预期工作。非常感谢。对于您的另一个建议:我将不得不在将来合并这些行(反转explode函数)。如果我使用
ignore_index=True
这不是会让事情变得更难吗?如果“something”列中的值最初是唯一的,那么在所有这些操作之后,您总是可以对该列执行
groupby
。如果没有,并且您需要依赖原始索引,那么是的,如果您重置它,将更难执行。因此,如果
df
[~condition]`对您有效,那么我会坚持认为是的,在
.expode()
之前,“something”中的值是唯一的,因此我将使用
groupby
。非常感谢。