我有以下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中排除。
A=TRUE
,并且在其第三行中具有B=abc
,因此满足
要求。 A=TRUE
,但B和C列是NaN
都是行,所以没有。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
答案 0 :(得分:1)
解决方案包括三个部分。
在列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