2017-07-30 17 views
2

私は現在、次のデータフレームがあります。列の範囲(パンダ)から新しいデータフレームを返す

df1 
     3  4  5   6 
0 NaN  NaN  Sea  NaN 
1 light medium light medium 
2  26  41.5  15  14 
3  32  40  18  29 
4  41  29  19  42 

を私は以降のみ海の列を新しいデータフレームを返すようにしようとしていたまま:

df1 
     5  6 
0  Sea  NaN 
1 light medium 
2  15  14 
3  18  29 
4  19  42 

私は私のコードと非常に近い午前感じる:

for i in range(len(df.columns)): 
    if pd.Series.any(df.iloc[:,i].str.contains(pat="Sea")): 
     xyz = df.columns[i] #This is the piece of code I am having trouble with 
    df = df.loc[:,[xyz:??]] 

基本的に私はの列のインデックスを返したいです「海」という単語が含まれていて、そのインデックスからデータフレームの長さまでの新しいデータフレームを作成します。うまくいけば、その説明が意味をなさないと、どんな助けもありがたいです。

答えて

6

ステップ1:動作しません

In [544]: df.loc[:, c:] 
Out[544]: 
     5  6 
0 Sea  NaN 
1 light medium 
2  15  14 
3  18  29 
4  19  42 

場合は、あなたがしたいことがあります。インデックスに使用df.loc

In [542]: c = df[df == 'Sea'].any().argmax(); c 
Out[542]: '5' 

ステップ2:列名を取得します。より明示的なバージョンに戻すことができます(簡略化のためpiRSquaredのおかげで):

df.iloc[:, df.columns.get_loc(c):] 
+0

'df.loc [:, C:]と実際にあなたができるだけのインデックス使用してthisby試すことができます' – maxymoo

+0

@maxymooマイティ感謝:)このああ –

+0

がより立派です私のアプローチ。 – miradulo

3

多分あなたはそうするための少し基本的な機能を書くことができました。それと

def match_cut(df, to_match): 
    for col in df.columns: 
     if df[col].str.match(to_match).any(): 
      return df.loc[:, col:] 
    return pd.DataFrame() 

は、それがこの関数のようなループの列を避けるようcᴏʟᴅsᴘᴇᴇᴅ's answerが好まなければならない、と述べています。


>>> match_cut(df, 'Sea') 
     5  6 
0 Sea np.nan 
1 light medium 
2  15  14 
3  18  29 
4  19  42 
1

あなたはlistindex

df2.ix[:,df2.ix[0,:].tolist().index('Sea'):] 


Out[85]: 
     5  6 
0 Sea  NaN 
1 light medium 
2  15  14 
3  18  29 
4  19  42 
関連する問題