2016-11-18 4 views
0

У меня есть следующий фреймворк данных, в котором каждый столбец содержит набор значений, и каждый индекс используется один раз. Однако я хотел бы получить полностью заполненный блок данных. Для этого мне нужно выбрать из каждого столбца значение X значений, в котором X - это длина столбца с наименьшими значениями, отличными от nan (в этом случае столбец «1.0»).Как вернуть df с не-nan значениями уникального столбца Pandas DataFrame Pythonically

>>> 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 
...    ...  ...  ...  ... 

Я достиг этого с помощью следующего кода, но это не очень путинский способ решения проблемы.

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) 

Есть более простой способ достижения тех же целей, так что я могу более автоматически повторять этот шаг для других dataframes? Предпочтительно без использования петель по соображениям эффективности.

+0

Я думаю, что вы можете написать функцию для столбцов, а затем применить для всего фрейма данных. – Rockbar

ответ

0

Я сделал функцию немного короче, пройдя по столбцам, и, похоже, она работает отлично.

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 
+1

, как сказано, изучите функцию приложения – Rockbar