簡體   English   中英

查找 pandas Dataframe 列的唯一行,其中第二列的所有值都是 NaN

[英]finding unique rows of a pandas Dataframe column for which all the values of a second column are NaN

嗨,我正在努力解決以下問題:

給定帶有列namevariable的 dataframe 我想創建 2 個列表:

  • list_names_nan 包含變量列中所有值為 nan 的名稱
  • list_names_not_nan 包含變量列中列表 1 值不是 nan 的名稱

下面是一個例子

import pandas
import numpy

df = pandas.DataFrame(data=[['x',1],['y',2],['x',4],['z',numpy.nan],
                            ['x',numpy.nan],['y',3],['x',numpy.nan],['z',numpy.nan],],
                            columns=['name','variable'])
df:
  name  variable
0    x       1.0
1    y       2.0
2    x       4.0
3    z       NaN
4    x       NaN
5    y       3.0
6    x       NaN
7    z       NaN

所需的 output 應該是

list_names_nan = [z]
list_names_not_nan = [x,y]

使用Series.isna創建一個 boolean 掩碼,然后在此掩碼上使用Series.groupby並使用all最后使用此掩碼m來過濾nannot_nan值:

m = df['variable'].isna().groupby(df['name']).all()
nan, not_nan = m[m].index.tolist(),  m[~m].index.tolist()

結果:

['z']  # nan
['x', 'y'] # not_nan

這是使用自定義聚合 function 的另一種方式:

agg = df.groupby('name').agg(lambda x: all(np.isnan(x))).reset_index()

這會生成一個聚合的 dataframe:

  name  variable
0    x     False
1    y     False
2    z      True

然后你就可以得到FalseTrue的名字

list_names_nan = agg.loc[agg['variable']==True]['name'].tolist()
list_names_not_nan = agg.loc[agg['variable']==False]['name'].tolist()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM