Python groupby在多个列上进行筛选并拆分为单独的数据帧

Python groupby在多个列上进行筛选并拆分为单独的数据帧,python,pandas,Python,Pandas,我有一个数据框,看起来像: LastName Date ObjectCol1 ObjectCol2 ObjectCol3 NumCol1 NumCol2 NumCol3 Intermediate1 Intermediate2 ABC March NA NA ABC June

我有一个数据框,看起来像:

LastName Date ObjectCol1 ObjectCol2 ObjectCol3 NumCol1 NumCol2 NumCol3 Intermediate1 Intermediate2
ABC      March                                                            NA              NA
ABC      June                                                             NA              NA
XYZ      March                                                            NA              Danger
XYZ      June                                                             Danger          Danger2
XYZ      July                                                             Danger          NA
AAA      March                                                            NA              NA
AAA      June                                                             NA              NA  
DEF      March                                                            NA              NA
DEF      June                                                             Danger          Danger2
DEF      July                                                             Danger          NA
我想将此数据帧拆分为两个数据帧,这样只有那些在中间1和2列中具有“始终”(表示所有日期)的lastname具有“NA”(字符串对象)(非空)的lastname才会被过滤到这1个数据帧中。 第二个数据帧的中间*列中有一些记录,其中任何姓氏都有“非NA”值(在日期历史记录中至少有一次)

因此,对于上面的示例df,带有ABC和AAA的行将进入一个数据帧。 带有XYZ和DEF的行应该进入另一个数据帧

我正在研究groupby和筛选,但是日期列处理的效果并不好。
你能提出什么建议吗?

首先通过获取所有与缺失值不匹配的
LastName
值,然后使用
isin
测试
LastName
的原始值,对于
df1
使用
~
反转掩码,对于
df2
使用非反转掩码:

vals = df.loc[~df[['Intermediate1','Intermediate2']].isna().all(axis=1),'LastName']
mask = df['LastName'].isin(vals)
如果每组至少有一个
True
,则测试的替代解决方案:

m = ~df[['Intermediate1','Intermediate2']].isna().all(axis=1)
mask = m.groupby(df['LastName']).transform('any')


抱歉,这些值不是null/NA,而是字符串“NA”@asimo-没问题,只需将
isna()
更改为
.eq('NA')
df1 = df[~mask]
df2 = df[mask]
print (df1)
  LastName   Date  ObjectCol1  ObjectCol2  ObjectCol3  NumCol1  NumCol2  \
0      ABC  March         NaN         NaN         NaN      NaN      NaN   
1      ABC   June         NaN         NaN         NaN      NaN      NaN   
5      AAA  March         NaN         NaN         NaN      NaN      NaN   
6      AAA   June         NaN         NaN         NaN      NaN      NaN   

   NumCol3 Intermediate1 Intermediate2  
0      NaN           NaN           NaN  
1      NaN           NaN           NaN  
5      NaN           NaN           NaN  
6      NaN           NaN           NaN 

print (df2)
  LastName   Date  ObjectCol1  ObjectCol2  ObjectCol3  NumCol1  NumCol2  \
2      XYZ  March         NaN         NaN         NaN      NaN      NaN   
3      XYZ   June         NaN         NaN         NaN      NaN      NaN   
4      XYZ   July         NaN         NaN         NaN      NaN      NaN   
7      DEF  March         NaN         NaN         NaN      NaN      NaN   
8      DEF   June         NaN         NaN         NaN      NaN      NaN   
9      DEF   July         NaN         NaN         NaN      NaN      NaN   

   NumCol3 Intermediate1 Intermediate2  
2      NaN           NaN        Danger  
3      NaN        Danger       Danger2  
4      NaN        Danger           NaN  
7      NaN           NaN           NaN  
8      NaN        Danger       Danger2  
9      NaN        Danger           NaN