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