如何 return df 使用唯一列的非 nan 值 Pandas DataFrame Pythonically

How to return df with non-nan values of unique column Pandas DataFrame Pythonically

我得到了以下数据框,其中每一列包含一组值,并且每个索引只使用一次。但是,我想获得一个完全填充的数据框。为了做到这一点,我需要 select 从每列中提取 X 个值,其中 X 是具有最少非 nan 值的列的长度(在本例中为“1.0”列)。

>>> stat_df_iws

iws_w           -2.0      -1.0       0.0       1.0
0           0.363567       NaN       NaN       NaN
1           0.183698       NaN       NaN       NaN
2                NaN -0.337931       NaN       NaN
3          -0.231770       NaN       NaN       NaN
4                NaN  0.544836       NaN       NaN
5                NaN -0.377620       NaN       NaN
6                NaN       NaN -0.428396       NaN
7                NaN       NaN -0.443317       NaN
8                NaN -0.268033       NaN       NaN
9                NaN  0.246714       NaN       NaN
10               NaN       NaN -0.503887       NaN
11               NaN       NaN       NaN -0.298935
12               NaN -0.252775       NaN       NaN
13               NaN -0.447757       NaN       NaN
14         -0.650598       NaN       NaN       NaN
15         -0.660542       NaN       NaN       NaN
16               NaN -0.952041       NaN       NaN
17         -0.667356       NaN       NaN       NaN
18         -0.920873       NaN       NaN       NaN
19               NaN -0.537657       NaN       NaN
20               NaN       NaN -0.525121       NaN
21               NaN       NaN       NaN -0.619755
22               NaN -0.652138       NaN       NaN
23               NaN -0.924181       NaN       NaN
24               NaN -0.665720       NaN       NaN
25               NaN       NaN -0.336841       NaN
26         -0.428931       NaN       NaN       NaN
27               NaN -0.348248       NaN       NaN
28               NaN  0.781024       NaN       NaN
29          0.110727       NaN       NaN       NaN
...              ...       ...       ...       ...

我用下面的代码实现了这个,但这不是解决这个问题的非常 pythonic 的方法。

def get_non_null_from_pivot(df):
    lngth = min(list(len(col.dropna()) for ind, col in df.iteritems()))
    df = pd.concat([df.loc[:,-2.0].dropna().head(lngth).reset_index(drop=True),\
                    df.loc[:,-1.0].dropna().head(lngth).reset_index(drop=True),\
                    df.loc[:,0.0].dropna().head(lngth).reset_index(drop=True),\
                    df.loc[:,1.0].dropna().head(lngth).reset_index(drop=True)], \
                   axis=1)

是否有更简单的方法来实现相同的目标,以便我可以更自动地为其他数据帧重复此步骤?出于效率原因,最好不要使用 for 循环。

我通过遍历各列使函数缩短了一些,它似乎运行良好。

def get_non_null_from_pivot_short(df):
    lngth = min(list(len(col.dropna()) for ind, col in df.iteritems()))
    df = pd.concat(list(df.loc[:,col].dropna().head(lngth).reset_index(drop=True) for col in df), \
                   axis=1)
    return df