質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

818閲覧

pivotしたdataframeとpivotしていないdataframeを結合したい。

Oisan

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/10/09 22:08

編集2021/10/10 00:42

<お知らせ>
少し前に自身でもう少し頑張ってみますとしていましたが、エラー②までいって行き詰りました。
どなたかご助言いただけますと大変助かります。
============================================

#実現したいこと。
Pythonでデータの整形を試みている中で、pivotしたdataframeとpivotしていないdataframeを結合(merge)したいです。

以下のような対象データ1のpivot後のデータと、対象データ2をmergeしたいのですがうまくいきません。

原因はpivotしていないデータの型と、pivotしたデータの型が違うためのようですが、解決策が浮かびません。

pivotする前に結合してしまう方法があるとは思うのですが、少しきれいじゃないように思うので、可能であればpivot後に結合したいと考えています。

◆対象データ1
pivot したデータは有価証券報告書を加工して得た以下のようなCSVをdataframeに入れて。

証券コード年度売上高
123420214656666
12342020100000
123420194656666
12342018100000

以下のようにしたものです。(数字はイメージです。将来的には証券コードは全データとなります。)

証券コード年度売上高CAGR
1234202146566660.5

◆対象データ2
東証の特定日の全株価データのCSVをdataframeに入れた以下のようなものです。

日付証券コード終値
2021/1/1012341095.5
2021/1/1012352050.6
2021/1/1012362050.5
2021/1/10123720959.5

#試したこと。
それぞれの証券コードをstr,int,flortに変更してみる。(pivot後のデータ型は変えられなかったので、対象データ1については、pivotする前に試みています。)

#現在記述しているコード
不要な記述もあります。ご容赦ください。

Python

1from math import nan 2import os 3import pandas as pd 4import numpy as np 5import const #const.py 6 7const.FOLDER_CURRENT = os.path.dirname(os.path.abspath(__file__)) 8const.FOLDER_EDINET = os.path.join(const.FOLDER_CURRENT,'data') 9const.FILE_EDINET_CSV = os.path.join(const.FOLDER_EDINET,'result/indicator_multiple.csv') 10 11 12 13def make_indicator_multiple(): 14 df = pd.read_csv('\indicator_single.csv',dtype={'証券コード':str},encoding="cp932") 15 df["証券コード"] = df["証券コード"].str[0:4] 16 17 df_only_current = df.groupby('証券コード').max('年度') 18 df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度'] 19 20 #追加する列名一覧 21 add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS'] 22 23 for column in add_columns: 24 for i in range(0,4): 25 j = i+1 26 df_pvt=df.pivot(index='証券コード',columns='n年前',values=column) 27 df_only_current[f"{column}_{i}{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j] 28 return df_only_current 29 30def file_merge(df_edinet): 31 columns =['日付','証券コード','区分','銘柄名','始値','高値','安値','終値','取引市場'] 32 df_stockprice = pd.read_csv('\stock_price.csv',names=columns,encoding="cp932") 33 print(df_edinet) 34 print(df_stockprice) 35 join_data = pd.concat([df_edinet,df_stockprice],join='証券コード') 36 37 print(join_data) 38 39def main(): 40 df_edinet = make_indicator_multiple() 41 file_merge(df_edinet) 42 43 print("finish") 44 45if __name__ == "__main__": 46 main()

#得られたエラーメッセージ
ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat

#エラーを受けて試したコード①
mergeからconcatに変えてみる。

Python

1join_data = pd.concat(df_edinet,df_stockprice)

#試したコードのエラー①
TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

#エラーを受けて試したコード②

Python

1join_data = pd.concat([df_edinet,df_stockprice],join='証券コード')

#試したコードのエラー②
Only can inner (intersect) or outer (union) join the other axis

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

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

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

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

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

can110

2021/10/10 01:11 編集

「pivot後のデータ型は変えられなかった」の詳細を記載ください。 どのようなコードで変えようとしてどのような結果(エラー?)になったのか。 また、できれば提示コードは他人がそのまま実行、検証可能な最小限のコードとしたほうが回答得られやすくなりますので修正検討ください。
Oisan

2021/10/10 01:17

もうしわけありません。不勉強なりにいろいろ試していた中で「うまくいかない」瞬間があったのですが、再現ができなくなってしまいました。以後気を付けたいと思います。
guest

回答1

0

自己解決

https://teratail.com/questions/312256?link=qa_related_pc

に記載のように、証券コードをインデックスにしてそろえたところ解決しました。

ありがとうございました。

投稿2021/10/10 01:03

Oisan

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問