如何通过从 python 中的选定行中删除 NULL 值来过滤数据框?

how to filter dataframe with removing NULL values from selected rows in python?

df=pd.DataFrame({'dept':['dept1','dept2','dept3','dept4','dept5'],
                 'room1':['0','1','1','NA','1'],
                 'room2':['1','0','NA','1','1'],
                 'room3':['0','0','1','NA','1'],
                 'room4':['1','NA','1','1','1'],
                 'count':['4','3','3','2','4']}


        dept  room1  room2 room3  room4 count
0      dept1    0      1     0      1    4
1      dept2    1      0     0      NA   3
2      dept3    1      NA    1      1    3
3      dept4    NA     1    NA      1    2
4      dept5    1      1    1       1    4

我有一个 select 框,用户可以在其中过滤所需的数据并根据他的 selection 显示记录。

预期结果:

if user select dept2 :

       dept  room1  room2 room3   
0      dept2    1      0     0   

if user select dept4:

       dept    room2     room4
0      dept4     1         1

代码:

option_dept = df["dept"].unique().tolist()
selected_dept = st.multiselect("search by departement",option_dept)
if selected_dept:
  df= df[df["dept"].isin(selected_dept)]

st.write(df)

问题是使用此代码显示所有列

如何删除每个 selected 行中包含 NA 或 null 的列?

Select 仅 deptroom 列,将可能的字符串 NA 替换为 NaNs 并删除缺失的列:

df= df[df["dept"].isin(selected_dept)].filter(regex='room|dept').replace('NA', np.nan).dropna(axis=1)

或者:

df= df[df["dept"].isin(selected_dept)].drop('count', axis=1).replace('NA', np.nan).dropna(axis=1)

假设用户选择 dept2 那么这段代码会给你想要的输出,

pd.DataFrame(df.loc[1, :].dropna()).T

输出-

dept room1 room2 room3 count
1 dept2 1 0 0 3

对于其他dept值,只需更改iloc函数中的行号即可。您甚至可以使用 df.set_index("dept") 将数据帧的索引设置为该行的 dept 值,然后使用 df.loc["dept_2", :] 获取该行的数据。