2017-04-20 58 views
4

我有一個數據框與幾列。我想要得到它的第一行索引:如何獲得一個pandas DataFrame的第一個索引,其中有幾個未定義的列不爲空?

  • A列的值不爲空
  • 存在至少n等列其值不爲空

例如:如果我的數據幀是:

  Date   A    B  C  D 
0 2015-01-02   NaN   1  1 NaN 
1 2015-01-02   NaN   2  2 NaN 
2 2015-01-02   NaN   3  3 NaN 
3 2015-01-02   1   NaN  4 NaN 
5 2015-01-02   NaN   2  NaN NaN 
6 2015-01-03   1   NaN  6 NaN 
7 2015-01-03   1    1  6 NaN 
8 2015-01-03   1    1  6  8 

如果n = 1,我會得到3

如果n = 2我想拿到7

如果n = 3,我會得到8

+0

爲什麼n = 1,你會得到6而不是3? –

+0

Mea culpa,你是對的,發佈編輯。 – Arthurim

回答

4

這裏有一個方法來獲得不同n's這些索引一氣呵成 -

def numpy_approach(df, reference='A'): 
    df0 = df.iloc[:,df.columns != 'Date'] 
    valid_mask = df0.columns != reference 
    mask = ~np.isnan(df0.values) 
    count = mask[:,valid_mask].sum(1) * mask[:,(~valid_mask).argmax()] 
    idx0 = np.searchsorted(np.maximum.accumulate(count),[1,2,3]) 
    return df.index[idx0] 

樣品試驗 -

In [555]: df 
Out[555]: 
     Date A B C D 
0 2015-01-02 NaN 1.0 1.0 NaN 
1 2015-01-02 NaN 2.0 2.0 NaN 
2 2015-01-02 NaN 3.0 3.0 NaN 
3 2015-01-02 1.0 NaN 4.0 NaN 
5 2015-01-02 NaN 2.0 NaN NaN 
6 2015-01-03 1.0 NaN 6.0 NaN 
7 2015-01-03 1.0 1.0 6.0 NaN 
8 2015-01-03 1.0 1.0 6.0 8.0 

In [556]: numpy_approach(df, reference='A') 
Out[556]: Int64Index([3, 7, 8], dtype='int64') 

In [557]: numpy_approach(df, reference='B') 
Out[557]: Int64Index([0, 7, 8], dtype='int64') 

In [558]: numpy_approach(df, reference='C') 
Out[558]: Int64Index([0, 7, 8], dtype='int64') 

In [568]: numpy_approach(df, reference='D') 
Out[568]: Int64Index([8, 8, 8], dtype='int64') 
+0

運行時出現以下錯誤:'result = getitem(key) IndexError:索引50超出軸1的大小爲50的範圍' – Arthurim

+0

@Arty有沒有這種情況,我們沒有3列那不都是空的?只編輯了代碼中的幾件事情。你可以運行它並告訴我哪一行你可能會得到那個錯誤? – Divakar

+0

是的,我沒有確切的說這種情況。我也沒有詳細說明目標列不是A而是B例如在最後一種情況下該怎麼辦? – Arthurim

3

您可以先通過A選擇哪裏都不NaN和列由loc計數,然後得到sumnotnull值的一行。減去1A列。

最後使用布爾面膜與idxmax

a = df.loc[df['A'].notnull(), 'A':].notnull().sum(axis=1).sub(1) 
print (a) 
3 1 
6 1 
7 2 
8 3 
dtype: int64 

N = 1 
print ((a == N).idxmax()) 
3 

N = 2 
print ((a == N).idxmax()) 
7 

N = 3 
print ((a == N).idxmax()) 
8 

print (df.loc[df['A'].notnull(), 'A':]) 
    A B C D 
3 1.0 NaN 4.0 NaN 
6 1.0 NaN 6.0 NaN 
7 1.0 1.0 6.0 NaN 
8 1.0 1.0 6.0 8.0 
+0

只有列A是第一列,但如果以前有其他列,您的答案纔有效? – Arthurim

+0

嗯,你從'A'到'df'結尾的列數? ('B,C,D',... columns?) – jezrael

+0

和樣本列A中的第二個是'print(df.loc [df ['A']。notnull(),'A':] )'不會返回count的列(也有列A',總是非NaN值,所以'sub(1)'減去它)。 – jezrael

相關問題