2016-09-20 5 views
1

pandas.DataFrameのコンストラクタを使用し、dtype引数を使用することに問題があります。文字列の値を保持したいのですが、次のスニペットは常に数値型に変換してNaNを返します。pandas.DataFrame文字列dtypeを設定する(ファイルベースではない)

from __future__ import unicode_literals 
from __future__ import print_function 


import numpy as np 
import pandas as pd 


def main(): 
    columns = ['great', 'good', 'average', 'bad', 'horrible'] 
    # minimal example, dates are coming (as strings) from some 
    # non-file source. 
    example_data = { 
     'alice': ['', '', '', '2016-05-24', ''], 
     'bob': ['', '2015-01-02', '', '', '2012-09-15'], 
     'eve': ['2011-12-31', '', '1998-08-13', '', ''], 
    } 

    # first pass, yields dataframe full of NaNs 
    df = pd.DataFrame(data=example_data, index=example_data.keys(), 
     columns=columns, dtype=str) #or string, 'str', 'string', 'object' 
    print(df.dtypes) 
    print(df) 
    print() 

    # based on https://github.com/pydata/pandas/blob/master/pandas/core/frame.py 
    # and https://github.com/pydata/pandas/blob/37f95cef85834207db0930e863341efb285e38a2/pandas/types/common.py 
    # we're ultimately feeding dtype to numpy's dtype, so let's just use that: 
    #  (using np.dtype('S10') and converting to str doesn't work either) 
    df = pd.DataFrame(data=example_data, index=example_data.keys(), 
     columns=columns, dtype=np.dtype('U')) 
    print(df.dtypes) 
    print(df) # still full of NaNs... =(



if __name__ == '__main__': 
    main() 

dtypesの値は、データフレーム内の文字列を保持しますか?参照用

$ pythonの--version

2.7.12

$のPIP2リスト| grepのパンダ

パンダ(0.18.1)

$のPIP2リスト|グレップのnumpyの

numpyの(1.11.1)

答えて

1

OPの特定のケースでは、​​を使用できます(DataFrameドキュメントのAlternate Constructorsセクションも参照してください)。それは、この例では必要ありませんが

from __future__ import unicode_literals 
from __future__ import print_function 

import pandas as pd 

columns = ['great', 'good', 'average', 'bad', 'horrible'] 
example_data = { 
    'alice': ['', '', '', '2016-05-24', ''], 
    'bob': ['', '2015-01-02', '', '', '2012-09-15'], 
    'eve': ['2011-12-31', '', '1998-08-13', '', ''], 
} 
df = pd.DataFrame.from_dict(example_data, orient='index') 
df.columns = columns 

print(df.dtypes) 
# great  object 
# good  object 
# average  object 
# bad   object 
# horrible object 
# dtype: object 

print(df) 
#    great  good  average   bad horrible 
# bob    2015-01-02       2012-09-15 
# eve 2011-12-31    1998-08-13       
# alice          2016-05-24  

あなたもDataFrame.from_dict() —でdtype=strを指定することができます。

EDIT:データフレームのコンストラクタは、列のコレクションとして辞書を解釈します

print(pd.DataFrame(example_data)) 

#   alice   bob   eve 
# 0       2011-12-31 
# 1    2015-01-02    
# 2       1998-08-13 
# 3 2016-05-24       
# 4    2012-09-15    

dataはとにかく関数のシグネチャの最初の引数であるので、私は、data=を落としています)。 (私はそれはあなたのNaN秒のデータフレームを与えて終わるかを正確にはわかりませんが)

print(pd.DataFrame(example_data, index=example_data.keys(), columns=columns)) 

#  great good average bad horrible 
# alice NaN NaN  NaN NaN  NaN 
# bob  NaN NaN  NaN NaN  NaN 
# eve  NaN NaN  NaN NaN  NaN 

:あなたのコードでは、行と列を混乱させる。あなたはとても

print(pd.DataFrame(example_data, index=columns)) 

#    alice   bob   eve 
# great        2011-12-31 
# good     2015-01-02    
# average       1998-08-13 
# bad  2016-05-24       
# horrible    2012-09-15      

何をしたい実際にこの—の転置です:カラム名を指定

print(pd.DataFrame(example_data, columns=example_data.keys(), index=columns)) 

#    alice   bob   eve 
# great        2011-12-31 
# good     2015-01-02    
# average       1998-08-13 
# bad  2016-05-24       
# horrible    2012-09-15 

が実際に不要である彼らはすでに辞書から解析され—を行うには正しいだろう移調することもできます!サンプルで述べたように提案を

print(pd.DataFrame(data=example_data, index=columns).T) 

#    great  good  average   bad horrible 
# alice          2016-05-24    
# bob    2015-01-02       2012-09-15 
# eve 2011-12-31    1998-08-13    
+0

これはうまくいきます。好奇心のために、オリジナルがそうではないのにこれがなぜ機能するのか知っていますか?普通のコンストラクタが辞書を取ることができるとすれば、なぜfrom_dictコンストラクタがどう振る舞うのかが分かりません。 – everial

+1

@everial:それをもっと慎重に見て、あなたが間違っていたことを理解しました。編集を参照してください。 –

+0

詳細なフォローアップをいただきありがとうございます...私はパンダの経験がどのようになっているかをご覧いただけます。 =) – everial

0

これは、適切な答えではありませんが、あなたが他の誰かによって1を取得している間、私はread_csv機能のすべての作品を使用したことに気付きました。

great,good,average,bad,horrible 
alice,,,,2016-05-24, 
bob,,2015-01-02,,,2012-09-15 
eve,2011-12-31,,1998-08-13,, 

、彼らがそうであるように

df = pd.read_csv('blablah/myData.csv') 

それは文字列を保持しますか:だから

あなたは.csvファイルにデータを配置する場合は、次のように、myData.csvと呼ばれます!

 great  good  average  bad  horrible 
alice NaN  NaN  NaN  2016-05-24  NaN 
bob  NaN 2015-01-02 NaN   NaN  2012-09-15 
eve 2011-12-31 NaN 1998-08-13  NaN   NaN 

必要に応じて、空の値をcsvファイルまたは他の文字/マーカーのスペースとして入れることができます。

+0

おかげで、そのデータは現在のファイルではありません - 私は本当にそれができるかどうread_csv' 'でそれを再読み込みするだけでそれを書きたくはありません避けてください。 – everial

関連する問題