<お知らせ>
少し前に自身でもう少し頑張ってみますとしていましたが、エラー②までいって行き詰りました。
どなたかご助言いただけますと大変助かります。
============================================
#実現したいこと。
Pythonでデータの整形を試みている中で、pivotしたdataframeとpivotしていないdataframeを結合(merge)したいです。
以下のような対象データ1のpivot後のデータと、対象データ2をmergeしたいのですがうまくいきません。
原因はpivotしていないデータの型と、pivotしたデータの型が違うためのようですが、解決策が浮かびません。
pivotする前に結合してしまう方法があるとは思うのですが、少しきれいじゃないように思うので、可能であればpivot後に結合したいと考えています。
◆対象データ1
pivot したデータは有価証券報告書を加工して得た以下のようなCSVをdataframeに入れて。
証券コード | 年度 | 売上高 |
---|---|---|
1234 | 2021 | 4656666 |
1234 | 2020 | 100000 |
1234 | 2019 | 4656666 |
1234 | 2018 | 100000 |
以下のようにしたものです。(数字はイメージです。将来的には証券コードは全データとなります。)
証券コード | 年度 | 売上高 | CAGR |
---|---|---|---|
1234 | 2021 | 4656666 | 0.5 |
◆対象データ2
東証の特定日の全株価データのCSVをdataframeに入れた以下のようなものです。
日付 | 証券コード | 終値 |
---|---|---|
2021/1/10 | 1234 | 1095.5 |
2021/1/10 | 1235 | 2050.6 |
2021/1/10 | 1236 | 2050.5 |
2021/1/10 | 1237 | 20959.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
回答1件
あなたの回答
tips
プレビュー