2016-07-20 5 views
0

私は、メジャーとマイナーのカラム名を持つテーブルをスクラップしています。私はこれを行うと、テーブルには、列名と列グループの両方を読んでくるので、そう(簡体字)のように列名がデータフレームにずれている:Pythonの最後の空のカラムに基づいてデータフレームを再フォーマットする

unnamed1 unnamed2 unnamed3 Year Passing Rushing Receiving  
    2015   NA   200  60  NA  NA   NA 
    2014   NA   180  70  NA  NA   NA 

私の挑戦はその列名をシフトしています「年」は「2015年」などと一致します。問題は、シフトする列の数がテーブルごとに一定ではないことです(これは多くのうちの1つにすぎません)。現時点では私のコードは次のようになります。

table1=read_html('http://www.pro-football-reference.com/players/T/TyexWi00.htm') 
df=table1[0] 
to_shift=len(df.dropna(how='all', axis=1).columns) #Number of empty columns to shift by 
df2=df.dropna(how='all',axis=1) #Drop the empty columns 
df2.columns=df.columns[-to_shift:] #Shift all columns left by the number i've found 

問題は、1つのstat(この単純な例を渡す)のどれを持っていないプレイヤーのために、データフレームの途中で完全に空白の列などがあるということです右端と同様に、コードが大きくずれることがあります。 1つが完全に空でない限り、右から左へ列を数える明確な方法はありますか?

多くのおかげで、私は私の質問がはっきりしていることを願っています!

答えて

1

完全に空でない限り、右から左へ列を数える明確な方法はありますか?

from itertools import takewhile 

len(df.columns) - len(list(takewhile(lambda col: df[col].isnull().all(), reversed(df.columns)))) - 1 

説明:指定された条件がFalseなるまで

takewhile戻り、リストのすべての要素が(前方から始まります)。 reversed(df.columns)で呼び出すと、最後からすべての要素が取得されます。 df[col].isnull().all()では、列のすべてのエントリがヌル(a.k.a. nan)かどうかを確認できます。したがって、上記のtakewhile式は完全に空の列の接尾辞を返します。 total_length - bad_suffix_length - 1を計算すると、条件がではなく、でない最初のインデックスが取得されます。 (ありがとうございました!)マイケル・ホフからの正しい応答に追加

+0

に編集されたが、スーパークリーンではない確かに思いました。実際にシフトを行うためにこれを書き直すと、そのコードを編集として投稿します! –

0

、コードは母のアプローチが良いと明確である

to_shift=len(df.columns) - len(list(takewhile(lambda col: df[col].isnull().all(), reversed(df.columns)))) #Index of origianl dataframe to keep 
df2=df.drop(list(takewhile(lambda col: df[col].isnull().all(), reversed(df.columns))),axis=1) #Drop the empty right side columns 
colnames=df.columns[-to_shift:] 
df2.columns=colnames 
関連する問題