🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

615閲覧

dataframe→panelにデータを移す際の型の不一致

kyonji

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/10/14 10:29

前提・実現したいこと

複数のdataframeをpanelを用いて整理したのですが、panelに整理した際に「型」が変わってしまいます。
dataframeでは列ごとにfloat64とint64の違うdataframeなのですが、panelに移した際、全てfloat64に変わってしまいます。
「型」直す方法、もしくは「型」を変えずにpanelに移す方法を教えてください。

プログラミングを学び始めて半年なので言葉がおかしいと思いますがご了承ください。

発生している問題・エラーメッセージ

エラーはなし

該当のソースコード

sample_frame2012=pd.read_csv("sapporo_2012_select.csv", encoding="shift-jis") sample_frame2013=pd.read_csv("sapporo_2013_select.csv", encoding="shift-jis") sample_frame2014=pd.read_csv("sapporo_2014_select.csv", encoding="shift-jis") sample_frame2015=pd.read_csv("sapporo_2015_select.csv", encoding="shift-jis") sample_frame2016=pd.read_csv("sapporo_2016_select.csv", encoding="shift-jis") sample_frame2017=pd.read_csv("sapporo_2017_select.csv", encoding="shift-jis") Panel_frame = pd.Panel({'2012':sample_frame2012,'2013':sample_frame2013,'2014':sample_frame2014,'2015':sample_frame2015,'2016':sample_frame2016,'2017':sample_frame2017}) print(sample_frame2012.dtypes) #元データ print(Panel_frame.ix[0].dtypes) 表示結果 年 int64 月 int64 日 int64 時 int64 分 int64 平均風速(10分移動平均) float64 気温 float64 現地気圧 float64 dtype: object 年 float64 月 float64 日 float64 時 float64 分 float64 平均風速(10分移動平均) float64 気温 float64 現地気圧 float64 dtype: object

試したこと

astypeで特定列だけint型に変更しようとしたのですが、うまくいきません。

Panel_frame.ix[0]['年']=Panel_frame.ix[0]['年'].astype(np.int64)
Panel_frame.ix[0]['月']=Panel_frame.ix[0]['月'].astype(np.int64)

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/10/14 11:02

2012以外のDataFrameも2012と全く同じ型ですか?
kyonji

2019/10/14 11:49

はい、型は一緒です。 学校から帰宅した為、証拠は挙げられませんが、確認しました。 ただ、異なる点があるとするなら潤年は行数が1日分(1440行)多いくらいです。
meg_

2019/10/14 12:00

float64は型推論の結果だと思うのですが。 sample_frame2012だけ(同じ元データのDataFrame)でPanelを作成したら、どうなりますか?
kyonji

2019/10/14 12:15

まだ試していなかったので、 明日試してみます! 学校のPCにデータが入っているため、昼頃の返信になると思います。 すみません。
kyonji

2019/10/14 12:18

あと、astypeでfloat64→int64にしようとして、変わらなかったのですが、そちらの方も助言をお願い致します。
meg_

2019/10/14 12:50

「astypeで特定列だけint型に変更しようとしたのですが、うまくいきません。」とは何がどうなったのでしょうか?(エラーが出たのか? 何も起こらなかったのか? など) あと、質問の際にはOSの種類、Pythonのバージョン、モジュールのバージョン等記入すると、適切な回答がつきやすくなるかと思います。
kyonji

2019/10/15 05:11

アドバイスありがとうございます。 OSはwindows10 、python3、pandasはver0.22.0 です。 astypeで特定列だけint型に変更しようとしたのですが、何も起こりませんでした。 以下ソースコードと実行結果です。 Panel_frame.ix[0]['年']=Panel_frame.ix[0]['年'].astype(np.int64) Panel_frame.ix[0]['月']=Panel_frame.ix[0]['月'].astype(np.int64) Panel_frame.ix[0]['日']=Panel_frame.ix[0]['日'].astype(np.int64) Panel_frame.ix[0]['時']=Panel_frame.ix[0]['時'].astype(np.int64) Panel_frame.ix[0]['分']=Panel_frame.ix[0]['分'].astype(np.int64) print(Panel_frame.ix[0].dtypes) 年 float64 月 float64 日 float64 時 float64 分 float64 平均風速(10分移動平均) float64 気温 float64 現地気圧 float64
kyonji

2019/10/15 05:16

また、sample_frame2012だけ(同じ元データのDataFrame)でPanelを作成してみたのですが、すべての列の型float64になってしまいました。 sample_frame2012=pd.read_csv("sapporo_2012_select.csv", encoding="shift-jis") Panel_frame = pd.Panel({'2012':sample_frame2012}) print(Panel_frame.ix[0].dtypes) 年 float64 月 float64 日 float64 時 float64 分 float64 平均風速(10分移動平均) float64 気温 float64 現地気圧 float64
3265462164

2019/10/15 23:48

meg_と言う方は私に叩かれてから方針変えたようですね 良い事です 前はURL貼るだけの使えないアホでしたから()
guest

回答1

0

ベストアンサー

astype()でnp.int64型に変換してみました。pfでdtypesを確認するとfloat64のままですが。

Python

1import pandas as pd 2import numpy as np 3 4df1 = pd.DataFrame({'年':[2017,2018,2019],'月':[1,2,3],'気温':[10.5,8.3,14.2]}) 5df2 = pd.DataFrame({'年':[2017,2018,2019],'月':[1,2,3],'気温':[10.5,8.3,14.2]}) 6 7pf = pd.Panel({'a':df1,'b':df2}) #型はfloat64になっていた 8 9pf['a']['年'] = pf['a']['年'].astype(np.int64) 10pf['b']['年'] = pf['b']['年'].astype(np.int64) 11print(pf['a']['年']) 12#0 2017 13#1 2018 14#2 2019 15#Name: 年, dtype: int64 16print(pf['b']['年']) 17#0 2017 18#1 2018 19#2 2019 20#Name: 年, dtype: int64 21 22print(pf.minor_xs('年').dtypes) 23#a float64 24#b float64 25#dtype: object

どやらデータの中にintとfloatがある場合、DataFrame全体の型がfloatとなってしまうようです。(文字列がある場合はobject)

投稿2019/10/15 11:28

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyonji

2019/10/15 15:14

ありがとうございます!! 各年度事にastypeを使用して、プログラムを回してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問