大熊猫-筛选分组中至少有一列包含非空值的分组

时间:2018-11-22 20:25:30

标签: python pandas filter

我有以下python pandas数据框:

df = pd.DataFrame({'Id': ['1', '1', '1', '2', '2', '3'], 'A': ['TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'FALSE'], 'B': [np.nan, np.nan, 'abc', np.nan, np.nan, 'def'],'C': [np.nan, np.nan, np.nan, np.nan, np.nan, '456']})

>>> print(df)
  Id      A    B    C
0  1   TRUE  NaN  NaN
1  1   TRUE  NaN  NaN
2  1   TRUE  abc  NaN
3  2   TRUE  NaN  NaN
4  2   TRUE  NaN  NaN
5  3  FALSE  def  456

我要结束以下数据框:

>>> print(dfout)
  Id     A    B   C
0  1  TRUE  abc NaN

相同的ID值可以出现在多行中。每个ID在其所有行上的A列中的值将始终为TRUE或FALSE。 B和C列可以具有任何值,包括NaN。
我希望在dfout中为每个具有A = TRUE的ID并显示在B和C列中看到的最大值的行。但是,如果对于所有Id的行,在B和C列中看到的唯一值= NaN,则该ID为从dfout中排除。

  • Id 1具有A=TRUE,并且在其第三行中具有B=abc,因此满足 要求。
  • Id 2具有A=TRUE,但B和C列是NaN 都是行,所以没有。
  • Id 3具有A=FALSE,因此它没有 符合要求。

我在ID上创建了一个groupby df,然后应用了一个掩码,仅包括A = TRUE的行。但是难以理解如何使用NaN删除B和C列中的所有行。

grouped = df.groupby(['Id'])
mask = grouped['A'].transform(lambda x: 'TRUE' == x.max()).astype(bool)
df.loc[mask].reset_index(drop=True)

  Id     A    B    C
0  1  TRUE  NaN  NaN
1  1  TRUE  NaN  NaN
2  1  TRUE  abc  NaN
3  2  TRUE  NaN  NaN
4  2  TRUE  NaN  NaN

然后我尝试了以下几种方法:

df.loc[mask].reset_index(drop=True).all(['B'],['C']).isnull

但是出现错误,例如:

  

“ TypeError:无法散列的类型:'list'”。

使用python 3.6,pandas 0.23.0;在此处寻求帮助:keep dataframe rows meeting a condition into each group of the same dataframe grouped by

1 个答案:

答案 0 :(得分:1)

解决方案包括三个部分。

  1. 过滤数据框以保留A列为True的行
  2. Groupby Id并首先使用,它将首先返回非null值
  3. 在列B和C上的结果数据框上使用dropna,以及如何=全部

    df.loc [df ['A'] == True] .groupby('Id',as_index = False).first()。dropna(subset = ['B','C'],how ='全部”)

        Id  A       B   C
    0   1   True    abc NaN