2016-03-04 107 views
-1

我想知道pandas數據框中有多少個點,其中索引是一系列日期,我需要在執行dropna()後以X點結束。我想要最新的觀點。例如:pandas dataframe查找第n個非isnull行

window = 504 
s1 = pd.DataFrame(stuff) 
len(s1.index) --> 600 
dropped_series = s1.dropna() 
len(dropped_series.index) --> 480 
diff_points_count = len(s1.index) - len(dropped_series.index) 
final_series = s1.tail(window + diff_points_count).dropna() 

- > len(final_series.index)不一定等於窗口。取決於NaN的位置。

我需要它來工作,其中S1可以是一個pandas.Series或pandas.DataFrame

+0

對不起,你找到最長的有效範圍後? – EdChum

+0

否 - 一個示例是我需要一個數據框中的每個列恰好504個有效點,但是當我將它們組合起來時,我會從數據庫b/c中爲每列提取600個點,所以我需要504在數據幀上執行df.dropna()之後。但是我不能僅僅做我在b/c之上做的事情,len(final_series.index)不能保證是504(這取決於nan是否在我的最後504點之內)。 – user1387717

+0

你沒有解釋你期望的是什麼,你有120個'NaN'行值你的窗口比你的有效數據點大,所以你想要什麼?你打算忽略缺失值,向前填充,回填,填充平均值等。? – EdChum

回答

0

這裏是我的解決方案,但我敢肯定有一個更優雅的方式來做到這一點:

all_series_df = pd.concat([harmonized_series_set[i] for i in series_indices], axis=1) 
    all_series_df['is_valid'] = all_series_df.apply(lambda x: 0 if np.any(np.isnan(x)) else 1, raw=True, axis=1) 
    valid_point_count = all_series_df['is_valid'].sum() 
    all_series_df['count_valid'] = valid_point_count - all_series_df['is_valid'].cumsum() + 1 
    matching_row_array = all_series_df.loc[all_series_df['count_valid'] == (window + output_length - 1)] 
    matching_row_index = 0 
    if isinstance(matching_row_array, pd.DataFrame) and len(matching_row_array.index) > 0: 
     matching_row_index = all_series_df.index.get_loc(matching_row_array.index[0]) 
    tail_amount = len(all_series_df.index) - matching_row_index 
    for i, arg in enumerate(args): 
     if i in series_indices: 
      tailed_series = harmonized_series_set[i].tail(tail_amount) 
      harmonized_args.append(tailed_series) 
     else: 
      harmonized_args.append(arg) 
    return tuple(harmonized_args)