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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

pandas

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

Q&A

解決済

1回答

773閲覧

Python Pandas 2つのpyファイルの作業を一つのpyファイルに書いて続けて実行したい。

eqeqe

総合スコア15

Python

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

pandas

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

0グッド

0クリップ

投稿2021/05/10 17:37

編集2021/05/10 18:00

Python Pandas 2つのpyファイルの作業を一つのpyファイルに書いて続けて実行したい。

プログラミング自体 超初心者です。

以前こちらで、質問させていただき、

以下CSV

A   B   C   D   E 
本 店 りんご
本 店 バナナ
本 店 みかん
本 店 いちご
芦屋店 バナナ
西宮店 りんご
西宮店 バナナ
尼崎店 りんご
三宮店 りんご
三宮店 バナナ
三宮店 みかん



A   B   C   D   E 
本 店 りんご バナナ みかん いちご
芦屋店 バナナ
西宮店 りんご バナナ
三宮店 りんご バナナ みかん

に置き換えてCSVに書き出すpyファイルと、

別途、その②のCSVを呼び出して


店名(A) ,  果物(B~E)
本 店, りんご 
バナナ
みかん 
いちご
芦屋店, バナナ
西宮店, りんご 
バナナ
三宮店, りんご 
バナナ 
みかん

(③このサイトの使用上空白が左詰めでややこしいので、画像のようにエクセルでいうところの表記でA列にA(店名)B列にB~E列(果物)の文字列をセル内改行で結合したもので2列にする感じです)
イメージ説明

に置き換えてCSVに書き出すpyファイルと、
それぞれ書き方をご指南いただきました。

イメージ説明↓コード


import pandas as pd

・#↓↓①一枚目の.pyの処理

df = pd.read_csv('./test.csv') #test.csvが店名と果物のCSVファイル①
shopNameList = []
outputData = [['A', 'B', 'C', 'D', 'E']]

for index, row in df.iterrows():

shopName = row[0] productName = row[1] if shopName in shopNameList: outputData[shopNameList.index(shopName) + 1].append(productName) else: outputData.append([shopName, productName]) shopNameList.append(shopName)

・#ここまでが①一枚目の.pyの処理

pd.DataFrame(outputData).to_csv('./output.csv', header=False, index=False) #② ①の処理のCSV保存

・#import pandas as pd [2枚の時に書いていたimport宣言]
・#df = pd.read_csv('./output.csv') [2枚の時に書いていた呼び出し処理]

・#↓↓② ①の処理のCSV保存

tmp = pd.DataFrame({
'店名': outputData['A'],
'果物': outputData['B'].str.cat("\n" + outputData['C'], na_rep='').str.cat("\n" + outputData['D'], na_rep='').str.cat("\n" + outputData['E'], na_rep='')
})

tmp.to_csv('./output-left.csv', index=False) # ③ のCSV保存

そこで、この2枚のpyを続けて書いて、
①~③を1枚のファイルで動かして2枚のCSVを出力させたいのですがうまくいきません…

まず2枚のファイルを③のimport部分省略で単純に並べると

①~②の処理
②.csvをフォルダに保存
②.csvを呼び出して
②~③の処理
③.csvをフォルダに保存

で、もちろん問題なく処理できるのですが、

単純に②.csvを呼び出しを消したら

③.csvが①の段階で②の処理を飛ばして③の左詰め処理が行われた結果になりました。

A   B   
本 店 りんご
本 店 バナナ
本 店 みかん
本 店 いちご
芦屋店 バナナ
西宮店 りんご
西宮店 バナナ
尼崎店 りんご
三宮店 りんご
三宮店 バナナ
三宮店 みかん

のような形です。

行いたい処理は③
イメージ説明

tmp = pd.DataFrame({ 'A': df['A'],~

tmp = DataFrame(outputData)({ 'A': df['A'],~

tmp = ({ 'A': df['A'],~

に変えても
raise KeyError(key) from errKeyError: 'A'

というエラーがでます。

tmp = pd.DataFrame({
'A': outputData['A'],
'果物': outputData['B'].str.cat("\n" + outputData['C'], na_rep='').str.cat("\n" + outputData['D'], na_rep='').str.cat("\n" + outputData['E'], na_rep='')
})

に変えても
'A': outputData['A'],
TypeError: list indices must be integers or slices, not str

というエラーがでます。

エラーを見ても全然わからなくて

なんとなく、
tmp = pd.DataFrame({ 

は、outputDataの作業前のdfを呼び出してしまっていること、

tmp = pd.DataFrame(outputData)({

だとoutputDataの工程はリストだから呼び出しできませんみたいな内容のエラーにも見えたりで困ってしまいました。

これは一回一回読み込ませないと難しいのでしょうか…

それとも、一つ目のこの店名と果物で縦のCSVを横に並べ変えた処理結果を呼び出してそれに対して続けて左詰めにして改行する処理にする何か良い案はあるでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

おはようございます。

問題文読ませていただきました。

以下の手順でご確認いただけますか?????‍♂️

  1. こちらのサイトへアクセスする。
  2. 緑の「Code」と書かれたボタンをクリックして、「Download ZIP」をクリックしてファイルをダウンロードする。
  3. ダウンロードしたzipファイルをデスクトップへ移動する。
  4. zipファイルをダブルクリックして展開する。
  5. ターミナルを開く。
  6. pandas-sample1-masterフォルダのディレクトリへ移動する。(cd {{path_to}}/pandas-sample1-masterコマンドを利用する。)
  7. python main.pyを実行する。

<ファイル構成の説明>
・main.py : csvファイル(sample.csv)を読み込んで、csvファイル(output.csv)を書き出すPythonファイルです。
・sample.csv : 読み込み用csvサンプルです。
・output.csv : 書き込み用csvサンプルです。

投稿2021/05/10 22:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

eqeqe

2021/05/11 05:40 編集

KUROROさん!いつもありがとうございます。 すごい!ますます私にはまだまだ超初心者なんだなと痛感するお答えに驚きがあります^^; 自分なりに頑張って咀嚼しようとしてみました。 最初に A 列用リスト shopNameList = [] B-E列リスト productList = [] の器を作っておく。 先にdefで関数を用いて def convertProductList(list): tmp = [] for l in list: tmp.append("\n".join(l)) return tmp で、リスト(カンマで分かれているもの)を文字列に変換、その際区切り文字を・とかスペースとかではなく"\n"改行であてがう。 というものを作っておく。(後で指定する) 下のfor文は前回の処理とほぼ同じですが、 前回はforの'B', 'C', 'D', 'E'処理結果を outputData = [['A', 'B', 'C', 'D', 'E']] という用意したDataFrameに入れる?に対して 今回はproductListに入れる?にしている。だから前回のヘッダー分の+1の指定も必要ない。 そしてproductListは前回の outputData とは違いリスト形式?だからCSVで書き出せないため上で用意しておいた convertProductListで(productList)を指定して書き出せるようにした。 pd.DataFrame({********************}).to_csv('./output.csv', index=False) で 現状の.DataFrameから 'A': 'B': を指定して書き出し という感じでしょうか?まだ私には相当難しいのかこんな感じのなんとなくの咀嚼しかできませんでした^^; 私の疑問点のリストはCSVで書き出せないをjoinで変える必要があること 今回は書き出し時に dfではなく pd.DataFrame({、になっているのは、私は初対面ですが、 df = は現在python上にいるDataFrameのことではなくあくまで元のCSVのことで 現在python上にいるDataFrameは上記の処理後のDataFrameになっていて それをpd.DataFrame({、で指定するということでしょうか? 2点、質問がございます。 1点目は、 この記述で前回の横並びのCSVは書き出せないのでしょうか? 質問文の②のCSVも同時に出力できないかを考えていたので、試しに pd.DataFrame({ 'A': shopNameList, 'B': productList, }).to_csv('output2.csv', index=False, encoding='shift_jis') にしても、A列、B列で A B 本 店 ['りんご', 'バナナ', 'みかん', 'いちご'] 芦屋店 ['バナナ'] 西宮店 ['りんご', 'バナナ'] 尼崎店 ['りんご'] 三宮店 ['りんご', 'バナナ', 'みかん'] になってしまいます(TT)おそらく今回はデータフレームではなくリストに格納したから? 2点目は、今回は同時に作業して効率化よくコードを書くという勉強はもちろんなのですが 当初の疑問の質問文①→②→③のような工程で①で出来た前回のoutputDataを書き出した後 そのデータフレームをを再度使用して工程を追加してくような考え方は間違いということなのでしょうか? 質問ばかりですみません!よろしくお願いします。
退会済みユーザー

退会済みユーザー

2021/05/11 09:13

> productListは前回の outputData とは違いリスト形式?だからCSVで書き出せないため上で用意しておいた 1次元配列と2次元配列の違いはわかりますか? [1, 2, 3]が1次元配列、[[1, 2, 3], [4, 5, 6]]が2次元配列になります。 2次元配列でDataFrameに格納すると、希望通りの出力へ適切に処理できない(もしかすると何か方法があるかもです)ので、1次元配列に変更する処理をconvertProductList関数で行っております。また、2次元配列から1次元配列へ変更する際に、改行処理を加えることで、Excelのセルへいい感じに表示されるように加工しております。 > この記述で前回の横並びのCSVは書き出せないのでしょうか? 今のままだとできないです。リストになっているデータ(productList)をばらす処理が必要になります。DataFrameとデータ構造を確認して、どのデータをDataFrameとして格納した時に何のCSVファイルが生成されるのか、考えつつ実行されることをお勧めします。 > ①→②→③のような工程で①で出来た前回のoutputDataを書き出した後 うーん、、私の思考として、 ・最後のCSVへ吐き出すためには、どのようにデータ加工すればいいのか考える。 ・どのタイミングでどのようにデータ加工、挿入して形式としてはどうすればいいのか(1次元配列?2次元配列?)考える。 ・ロジックを組む。 ・コードを書く。 ですので、そもそも同じデータ形式(outputData)から何とかしようと考えなかったというのが答えになります。(前のデータを引き継かない方が綺麗かつデータの理解が容易であると判断しました。)
eqeqe

2021/05/11 12:33 編集

KUROROさんありがとうございます! 1次元配列と2次元配列の違いは今のご説明で分かりました! 「今のままだとできないです。」 KUROROさんのコードの書き方を拝見しても最初に最終的な受け皿の部分を書かれていらっしゃるのはわかるのでロジック→コードはよくわかります^^ こういう2枚の作業を1つにしたいとか1つの作業に追加したい事案に出会ったときには、簡易的に継ぎ足せるものは継ぎ足せるけど、基本的に継ぎ足していくような考えではなくロジックを組みなおして作り直すほうがベターということなのですかね?!そのあたりのエンジニアさん的な考え方みたいものが知りたかった部分でもあったのでよく解りました!ありがとうございます!
退会済みユーザー

退会済みユーザー

2021/05/11 20:29

> 基本的に継ぎ足していくような考えではなくロジックを組みなおして作り直すほうがベターということなのですかね?! 時と場合によりますね。 今回やることとしては、 ・csvファイルを読み込む。 ・データ加工する。 ・データを書き込む。 だと思いますので、それぞれ共通できるところは関数で切り出したりして対応したりします。今回の場合、データ加工の部分が大幅に変わるということもあり、ほとんど変えてしまった次第です。
eqeqe

2021/05/12 00:17

こんにちはそうだったのですね。やはりそのあたりは経験がものをいいそうですね^^ どの方向からでもこう作ろうって思えるようになれるように頑張ってみたいなとも思いました。 いつもありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問