2016-12-09 9 views
0

背景:私は上の別の列に分割する必要が名前の変更、列+データフレームに不足している列を追加

>>> merge_df['AAChange'] 
0 STK11:NM_000455:exon1:c.148_149TG 
Name: AAChange, dtype: object 

私はこのようになります列を持つデータフレーム、持っている「と」文字、このような:

>>> new_cols = merge_df['AAChange'].str.split(':').apply(pd.Series,1) 
>>> new_cols 
     0   1  2   3 
0 STK11 NM_000455 exon1 c.148_149TG 

は、その後、私は列の名前を変更する必要があるので、私は、リストに新しい名前を格納します。

>>> new_colnames = ['Gene.AA', 'Transcript', 'Exon', 'Coding', 'Amino Acid Change'] 

しかし、これらの5つの列はすべて出力に存在しなければなりませんが、このデータ入力ではソースデータにフィールドが4つしか残っていませんでした。だから、列の名前を変更しようとすると、失敗します。

>>> new_cols.columns = new_colnames 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/local/apps/python/2.7.3/lib/python2.7/site-packages/pandas/core/generic.py", line 2371, in __setattr__ 
    return object.__setattr__(self, name, value) 
    File "pandas/src/properties.pyx", line 65, in pandas.lib.AxisProperty.__set__ (pandas/lib.c:45002) 
    File "/local/apps/python/2.7.3/lib/python2.7/site-packages/pandas/core/generic.py", line 425, in _set_axis 
    self._data.set_axis(axis, labels) 
    File "/local/apps/python/2.7.3/lib/python2.7/site-packages/pandas/core/internals.py", line 2572, in set_axis 
    'new values have %d elements' % (old_len, new_len)) 
ValueError: Length mismatch: Expected axis has 4 elements, new values have 5 elements 

だから、私はすべての不足している列に空の列を追加し、同時に列名を変更するには、両方たいです。 This answerは良い解決策があるようでした。新しい列リストに基づいてインデックスを再作成します。しかし、望ましい結果が得られません:

>>> new_cols.reindex(columns = new_colnames) 
    Gene.AA Transcript Exon Coding Amino Acid Change 
0  NaN   NaN NaN  NaN    NaN 

今私はすべての欠落している列を持っていますが、元のデータは失われています。既存の列の名前を変更し、すべての不足している列を追加するためのより良いソリューションはありますか?

所望の出力は次のようになります。

>>> new_cols.reindex(columns = new_colnames) 
    Gene.AA Transcript Exon   Coding Amino Acid Change 
0 STK11 NM_000455 exon1 c.148_149TG    NaN 
+0

スプリットの出力には、5つの名前を割り当てようとしているときに4つの列が含まれています。私はあなたがインデックスの名前をしようとしていると思いますか? – sirfz

+0

'new_colnames'のリストに基づいて列の名前を変更しようとしています。 99%の場合、splitの出力は5つのフィールドすべてを指定し、 'new_cols.columns = new_colnames'は正しく動作しますが、時にはフィールドの欠落したこのようなデータエントリにヒットすることがあります。 – user5359531

+0

申し訳ありませんが、質問を書き直す必要があります。問題は実際には、結果が必要なフィールド数より少なくなるケースを実際に処理しています。 – sirfz

答えて

0

あなたは主要な目的のものと元の列名を変更することができます。

new_cols.columns = new_colnames[:-1] 

# new_cols 
    Gene.AA Transcript Exon  Coding 
0 STK11 NM_000455 exon1 c.148_149TG 

次に、以下のコマンドで余分なものを挿入します。新しい列を#4列として挿入し、nanの値を入力します。

new_cols.insert(4, new_colnames[-1], [np.nan]*len(new_cols.index)) 

# new_cols 
    Gene.AA Transcript Exon  Coding Amino Acid Change 
0 STK11 NM_000455 exon1 c.148_149TG    NaN 
関連する問題