2017-08-14 75 views
1

我想解決以下問題: 我有一個數據幀。對於其中一列,我有NAN和數字,以隨機方式分發。我想根據此列刪除行。我的標準是:如果上面的這條線和下面的線都有NAN值,那麼我就放棄這條線。否則,我保留在我的數據框中。掉落在的條件

這是我設法得到的,但我很肯定這是錯誤的...任何幫助非常感謝!

i=0 
while i <= 500: 
    if (np.isnan(df.iloc[i+1]['column1'])) & (np.isnan(df.iloc[i-1]['column1'])): 
     df2[i] = df.drop(df[i]) 
+1

是否要刪除所有的NaN和那個值或只是那一行並保留NaN?無論如何,你是否會放棄所有的NaN? –

+1

我不想刪除所有的NaN。我合併了兩個數據集,我只關注屬於數據集2的值以及數據集1中的值,它們在數據集2之前和之後立即出現。PS:數據集具有不同的列,因此此是所有NaNs的原因。 –

回答

2

創建採樣數據:

np.random.seed(0) 
df= pd.DataFrame({'column1': np.random.randn(10)}) 
df.iloc[[2, 4, 7], 0] = np.nan 
>>> df 
    column1 
0 1.764052 
1 0.400157 
2  NaN 
3 2.240893 # <<< Drop. 
4  NaN 
5 -0.977278 
6 0.950088 
7  NaN 
8 -0.103219 
9 0.410599 

應用過濾器。

>>> df[~((df['column1'].shift(1).isnull()) & (df['column1'].shift(-1).isnull()))] 
    column1 
0 1.764052 
1 0.400157 
2  NaN 
4  NaN 
5 -0.977278 
6 0.950088 
7  NaN 
8 -0.103219 
9 0.410599 
+1

不確定沒有看到數據。我的猜測是'NaN'可能是文本值而不是numpy'NaN'。請注意,如果您有三個連續的"NNN「行,則會根據您的要求放棄中間一行。 – Alexander

+0

嗨,亞歷克斯,我發現了這個問題。我在邏輯條件內需要一個額外的條件。最後,這是最後的修正:df1 = df [〜((df ['col1']。shift(1).isnull())&(df ['col1']。shift(-1).isnull ))&(df ['col1']。isnull()))] –

+1

因此,您的條件是刪除上面的那個是NaN的行,下面的那個是NaN,而行本身不是NaN。 – Alexander

1

示例數據

my_df = pd.DataFrame({ 
    "col1":[5.43,np.nan, np.nan, 0.5, 0.4, 0.5, np.nan, 0.1, np.nan, 0.33] 
}) 

您可以創建移動列,避免循環您的數據集。

my_df['forward_shift'] = my_df.col1.shift(periods=1) 
my_df['backward_shift'] = my_df.col1.shift(periods=-1) 

out = my_df[-(np.isnan(my_df.forward_shift) & np.isnan(my_df.backward_shift))] 
out['col1'].reset_index(drop=True) 

0 NaN 
1 NaN 
2 0.5 
3 0.4 
4 0.5 
5 NaN 
6 NaN 
Name: col1, dtype: float64 
+0

我嘗試使用你的方法,但我得到了以下錯誤:{TypeError:ufunc'isnan'不支持輸入類型,並且輸入無法安全地強制轉換爲任何受支持的類型根據轉換規則''安全'' 。 }我認爲這是因爲我所有的數據幀類型都是對象。我不知道如何解決這個問題... –

+1

@LauraSimonsenLeal你可以試試'df ['col1'] = df ['col1']。astype(np.float32)''。這應該將其從一個對象改爲float32。 – gobrewers14