2016-07-22 15 views
4

私は自分自身が非常に頻繁にやらなければならないことが1つあり、パンダでこれを達成することがどれほど難しいか驚いています。指定したインデックスタイプと名前、カラムのタイプと名前を持つ空のDataFrameを作成する必要があるとします。 (これは後でループで記入するといいかもしれません。)これを行う最も簡単な方法は、空のpandas.Seriesオブジェクトを各列に作成し、dtypeを指定して、名前を指定し、辞書をDataFrameコンストラクタに渡します。次のようなものPython Pandas、カラムdtypesを指定する空のDataFrameを作成

def create_empty_dataframe(): 
    index = pandas.Index([], name="id", dtype=int) 
    column_names = ["name", "score", "height", "weight"] 
    series = [pandas.Series(dtype=str), pandas.Series(dtype=int), pandas.Series(dtype=float), pandas.Series(dtype=float)] 
    columns = dict(zip(column_names, series)) 
    return pandas.DataFrame(columns, index=index, columns=column_names) 
    # The columns=column_names is required because the dictionary will in general put the columns in arbitrary order. 

最初の質問です。上記は本当にこれを行う最も簡単な方法ですか?これについて畳み込まれているものはたくさんあります。私が本当にやりたいこと、そして本当にたくさんの人が本当にやりたいことは、次のようなものです。

df = pandas.DataFrame(columns=["id", "name", "score", "height", "weight"], dtypes=[int, str, int, float, float], index_column="id") 

2番目の質問です。パンダで可能な限り文法はありますか?そうでない場合、開発者はこれのような何かをサポートすることを検討していますか?それは本当にこのような単純なものでなければならないと感じています(上記の構文)。

答えて

3

残念ながらDateFrame ctorのは、しかし、あなたがread_csvを使って、少しカンニングすることができ、単一dtype記述子を受け入れ:

In [143]: 
import pandas as pd 
import io 
cols=["id", "name", "score", "height", "weight"] 
df = pd.read_csv(io.StringIO(""), names=cols, dtype=dict(zip(cols,[int, str, int, float, float])), index_col=['id']) 
df.info() 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 0 entries 
Data columns (total 4 columns): 
name  0 non-null object 
score  0 non-null int32 
height 0 non-null float64 
weight 0 non-null float64 
dtypes: float64(2), int32(1), object(1) 
memory usage: 0.0+ bytes 

だから、あなたが望むようdtypesがあることを確認し、必要に応じてインデックスが設定されていることができます。

In [145]: 

df.index 
Out[145]: 
Int64Index([], dtype='int64', name='id') 
あなたはそれを交換することによっても、データフレームの列のDTYPEを設定することができ
+0

ニースチート!だから、あなたが不正行為をすることなく、私の巻き込まれた方法は本当にそれをやるのが一番簡単な方法だと言っていますか? – Ray

+0

私は 'read_csv'を使うのが最も簡単な方法だと思います。標準の' DataFrame' ctorに比べて柔軟性があります。空のファイルを意図的に読んでいる点を除いて不正ではありません – EdChum

1

df['column_name'] = df['column_name'].astype(float) 
1

あなたがこれはあなたがすでに何をやったかの効果で大幅に異なっていないリストの内包

def create_empty_dataframe(): 
    index = pandas.Index([], name="id", dtype=int) 
    # specify column name and data type 
    columns = [('name', str), 
       ('score', int), 
       ('height', float), 
       ('weight', float)] 
    # create the dataframe from a dict 
    return pandas.DataFrame({k: pandas.Series(dtype=t) for k, t in columns}) 

を使用して、物事を少し簡略化するが、することなく、任意のデータフレームを作成しやすくする必要がありますコード内の複数の場所を変更します。

関連する問題