2017-09-07 43 views
1

私はパンダを使ってデータフレームを作成し、それをテーブルパッケージとともに.txtファイルに書き出します。しかし、私は.txtテーブルのカラムにを正確にの11文字の幅にする必要があります(これは後で.txtが固定幅カラムだけを読み込むFortranプログラムによって読み込まれるためです)。パンダやテーブルパッケージでは、テーブルの列の幅を設定するオプションはありません。私は約pandas.set_option('display.max_colwidth',100)読みが、これは唯一の最大幅、ない固定幅を設定し、それがないファイルへの書き込みため、表示ためです。pandas-pythonまたはtabulate:FIXED列幅を設定する方法は?

誰もが幅を設定するオプションを知っていますか?あるいは、これを可能にする別のパッケージを表にすることができますか? @のzipaのANSWERの指示によるもの


SOLUTION:

出力は、幅= 11文字の列に実際に今あるが、右から5番目の列に1本が中断されることを見ている - ので、浮動小数点< 10e + 11は10進表記で表され、指数関数/科学ではありません。これは、STR(x)は、ここで見

によって引き起こされ、右から5番目の列を確認してください。 df.fillna(' ',inplace=True)

C_2_  ,nan  ,nan  ,nan  ,nan  , C   , C   ,nan  ,nan  ,nan  ,2.49e-08 ,0.0  ,71600  ,2   ,100  ,6.01e+11 ,-1.0  ,71600  ,2   ,100   
CH   ,nan  ,nan  ,nan  ,nan  , C   , H   ,nan  ,nan  ,nan  ,3.16e-10 ,0.0  ,33700  ,2   ,100  ,7630000000.0,-1.0  ,33700  ,2   ,100   
CN   ,nan  ,nan  ,nan  ,nan  , C   , N   ,nan  ,nan  ,nan  ,1e-09  ,0.0  ,71000  ,2   ,100  ,24200000000.0,0.0  ,71000  ,2   ,100   
CO   ,nan  ,nan  ,nan  ,nan  , C   , O   ,nan  ,nan  ,nan  ,0.000152 ,-3.1  ,12900  ,2   ,100  ,3.67e+15 ,-4.1  ,12900  ,2   ,100 

をこの問題を解決するためには、最初に私がbalnk空間に「ナン」を投入しました。次はzipaの後のコメント@続き、彼の提案1行のコードを変更 - 私は、ラムダ関数が取る作られている場合、句とエントリが文字列またはフロートであるかによって異なる動作を持っています

df = df.applymap(lambda x: str(x).ljust(11) if type(x)==str else str('{:.3e}'.format(x)).ljust(11)) 

そして、これ私の問題を解決! - 次の出力を参照してください。これは何が必要かもしれない、まあ

C2   ,   ,   ,   ,   , C   , C   ,   ,   ,   ,2.490e-08 ,0.000e+00 ,7.160e+04 ,2.000e+00 ,1.000e+02 ,6.010e+11 ,-1.000e+00 ,7.160e+04 ,2.000e+00 ,1.000e+02 
CH   ,   ,   ,   ,   , C   , H   ,   ,   ,   ,3.160e-10 ,0.000e+00 ,3.370e+04 ,2.000e+00 ,1.000e+02 ,7.630e+09 ,-1.000e+00 ,3.370e+04 ,2.000e+00 ,1.000e+02 
CN   ,   ,   ,   ,   , C   , N   ,   ,   ,   ,1.000e-09 ,0.000e+00 ,7.100e+04 ,2.000e+00 ,1.000e+02 ,2.420e+10 ,0.000e+00 ,7.100e+04 ,2.000e+00 ,1.000e+02 
CO   ,   ,   ,   ,   , C   , O   ,   ,   ,   ,1.520e-04 ,-3.100e+00 ,1.290e+04 ,2.000e+00 ,1.000e+02 ,3.670e+15 ,-4.100e+00 ,1.290e+04 ,2.000e+00 ,1.000e+02 

答えて

1

を、それが11文字に長いテキストすべてを回す:

import pandas as pd 

df = pd.DataFrame({'a': [12345, 2, 3], 'b': list('ABC')}) 
df = df.applymap(lambda x: str(x).ljust(11)) 
df.columns = df.columns.map(lambda x: str(x).ljust(11)) 
df.to_csv('somefile.txt', index=False) 
+0

をこれは、列の初期値として長い間、仕事をしていません文字列です。しかし、いくつかの値は大きなフロートです。そして、あなたの解はすべての浮動小数点<1.0e + 11を小数として表現します。たとえば、7.63e + 09は7630000000.0と表示され、これは列幅の範囲を超えて配置を破棄します。私はその理由は、str(x)で文字列にエントリを回していると思う。私たちはあなたが提案し、まだ**浮動小数点**を使用するマッピングを行うことはできますか?または、ファイルに書き込む前に浮動小数点数に変換できますか? – Nestak

+0

あなたの全体の列が浮動小数点の場合、その列を ''{:.2e}'のようにキャストできますか?format(7630000000.0)'? – zipa

+0

これは解決策だと思いますが、データフレーム全体に約10ダースの列を実装するには多くのコーディングが必要になります。半分は浮動小数点数、半分は文字列数です。私はより簡単な方法を探しています – Nestak

関連する問題