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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

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

Q&A

解決済

4回答

1300閲覧

Python pandas CSV のデータ加工につきまして、

eqeqe

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

pandas

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

0グッド

1クリップ

投稿2021/05/06 15:18

編集2021/05/06 18:51

Python pandas CSV のデータ加工につきまして、

お店の仕入れデータで下の【元データ】のようなものCSVがあるのですが
別のソフトに読み込ますときに【最終】の形にしないといけなくて
今はエクセルで手動で置換&行削除していますがミスがあったりするので
できれば自動化したいと思っています。

【元データ】

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

【途中】

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

【最終】

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

と、店名(A列)と商品(B列)が商品(B列)で縦に羅列されたものを
と、店名(A列)と商品(B列)を横に並べるようにしたいのですが、

順序が逆ですが【途中】→【最終】は

df1 = df.drop_duplicates(subset=['A'], keep='first') で、自力で出来たのですが

肝心の【元データ】→【途中】で困っています。

頭の中では、
① A列上から順に上下の行を比較して同じだった(重複)場合、
② 比較した下側の隣のB列同行を指定した文字列を抽出し、
③ 一つ上のC列(比較上側のC列)に②の値を追加
④ 但し、その一つ上のC列(比較上側のC列)が空白(NaN)でない場合はさらに横の比較上側のD列)に追加
⑤ そのD列(比較上側のD列)も空白(NaN)でない場合はさらに横の比較上側のE列)に追加

かなと考えております。

【現状】

del_list = []
for i in range(len(df)):

bf = i-1, 1
af = i, 1
add = df.iloc[i, 2]

if df.iat[bf] == df1.iat[af]:
df.iloc[i-1, 3] = add
del_list.append(i)
df.drop(del_list, inplace=True, errors='ignore')
print(df)

で、何とか①~③は出来たっぽいのですが
④⑤の記述がよくわかりません。

del_list = []
for i in range(len(df)):
bf = i-1, 1
af = i, 1
add = df.iloc[i, 2]

if df.iat[bf] == df.iat[af] and df1iloc[i-1, 3] == np.nan:
df.iloc[i-1, 3] = add
de_list.append(i)

df.drop(del_list, inplace=True, errors='ignore')
print(df)

だとSyntaxError: invalid syntaxになってしまい。
np.nan(NaN)が原因なのか and が原因なのかもわからない状態です。

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

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

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

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

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

guest

回答4

0

ベストアンサー

おはようございます。

お店関連の事務処理の自動化のために、pandas利用されていたんですね。少しでも改善されようとしてて素敵です。

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

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

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

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

投稿2021/05/06 22:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

eqeqe

2021/05/07 22:29 編集

KUROROさんおはようございます!そうなんです…有難うございます!何より手動でミスに気付かないのが問題になっていました^^; 前回の質問ではあまりに丸投げの質問は失礼かと思い、何とか自力でという思いで質問しました。お陰様で前回一つ勉強になり、それを生かそうと試みましたが あれから調べまくって今回の質問のコードまでたどり着いたものの現状の私の知識ではさすがにお手上げで…具体的に質問させていただきました。一つ一つご説明いただき、ものすごく咀嚼し易くて驚きました。 まさに頭の中でイメージしていた通りにみるみる動いていく感じでびっくりしました。そして参考文献を見て私の引っ掛かりは初心者あるあるあるなんだとも思い知りました^^; ただ単にコピペして使用させていただくというのは失礼なことと思い、いただいたファイルの#説明文を一文一文咀嚼していたのでお礼のご連絡が遅くなりすみませんでした。 自分なりに咀嚼した結果が、 ・CSVを呼びだす。 ・まず先に最終的な 列名 A,B,C,D,E のデータ群の大枠の器を作っておく。 ・A列(0列目)には店名、B列(1列目)には商品名に指定したリストを作る。 ・そこでまずA列店名が始まる1行目(0行名は'A’の為)からその要素を一つずつ順番に下の行と比較していき、リストに同じものがあれば次々上側の最終列にその行のB列(商品名)を追加してデータ群に書くように指示。※ちなみに私が質問前に一番困惑していたのはここです(TT) ・逆にリストに同じものが無ければ、店名、商品名をそのままデータ群に書いて更にリストにも新しくその店名を入れる そのことで forに戻って新しくその店名から同様の処理が始まる。 1行目==2行目(同じ)店名+商品名 1行目の最後尾にさらに比較した側の商品名追加 1行目==3行目(同じ)店名+商品名 1行目の最後尾にさらに比較した側の商品名追加 1行目==3行目(同じ)店名+商品名 1行目の最後尾にさらに比較した側の商品名追加 1行目==4行目(違う)4行目の店名+最後尾にB商品名追加(elseの指示のまま) 4行目==5行目(同じ)店名+商品名 1行目の最後尾にさらに比較した側の商品名追加 4行目==6行目(同じ)店名+商品名 1行目の最後尾にさらに比較した側の商品名追加 4行目==7行目(違う)7行目の店名+最後尾にB商品名追加(elseの指示のまま) 7行目==8行目(同じ)店名+商品名 1行目の最後尾にさらに比較した側の商品名追加 のようなイメージ 私は質問段階ではてっきり 1行目==2行目(同じ)そのまま 2行目==3行目(同じ)右斜め上に追加↑→ 3行目==4行目(同じ)右斜め上の隣に追加↑→→ 5行目==6行目(違う)そのまま のような解釈をしていました^^;まずそこが駄目だったんでしょうか… ・完成したデータをCSVで書き出すためデータフレーム形式に変更(その際元データ形式通りにするため header, indexは削除) という解釈をいたしましたが合っていればよいのですが。 今回も私に無い新しい知識や考え方をお教えいただき、本当にありがとうございます。 特に今回知れたことはCSVデータそのものを変更していくような考え方ではなくpandas内で別途リストを作って作業して結果をデータにしていくという考え方など、改めて自分が無知中の無知だなと感じる反面、とても楽しく勉強になりました! まだまだ自動化に挑戦したいデータもたくさんあり勉強していこうと思っているので、また甘えてしまう事が多々あると思いますがお力添えいただければ幸いです。誠に有難うございました。
退会済みユーザー

退会済みユーザー

2021/05/07 23:36 編集

おー、丁寧に文章読んでいたんですね。ありがとうございます!????‍♂️ 解決できてよかったです。 上記の文章読ませていただきました。90%くらい合っているのですが、所々認識違いを起こしているかもです。 恐らくなんですが、コードとリンク先を丁寧に読んで頂いたように思いますが、実際にコードを触りながらデータ内容の動きを確認していないように感じました。 より成長していただきたいので、 print(出力したいもの) exit() を利用して、知りたい情報をprintで表示しつつ、後続処理を停止するためにexit()をprintの下に設置してコードの動きを分析してみてください。 今回ですと、 ・for文の中身でどのようなことをしているのか? ・現在のoutputDataの中身ってどうなっているんだっけ? みたいなことが明瞭になります。 printについて(https://note.nkmk.me/python-print-basic/ ) exitについて(https://techacademy.jp/magazine/15831 ) 是非また気軽にご連絡ください。 Enjoy!!!
eqeqe

2021/05/08 07:46

ありがとうございます!この機会に一つずつ確認していきたいのでprint&exitのリンク先を見て確認作業をしてみます!
guest

0

こういう、同じものでまとめて処理したいときはgroupbyを使うのが良いです。

今回の場合、いったんlistでまとめて、それをDataFrameに展開するとできます。

python

1# Aが同じBをlistでまとめる 2x = df.groupby('A', sort=False)['B'].apply(list) 3# DataFrame化 4df2 = pd.DataFrame(x.to_list(), index=x.index) 5# 整形 6df3 = df2.reset_index() 7df3.columns = ['A', 'B', 'C', 'D', 'E']

投稿2021/05/06 23:55

bsdfan

総合スコア4560

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

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

eqeqe

2021/05/07 19:54 編集

bsdfanさん!とても短いコードで書けそうで驚いています。 ただ現状で、コピペさせていただいても A B C D E 0 本 店 りんご NaN NaN NaN 1 本 店 バナナ NaN NaN NaN 2 本 店 みかん NaN NaN NaN 3 本 店 いちご NaN NaN NaN 4 芦屋店 バナナ NaN NaN NaN 5 西宮店 りんご NaN NaN NaN 6 西宮店 バナナ NaN NaN NaN 7 尼崎店 りんご NaN NaN NaN 8 三宮店 りんご NaN NaN NaN 9 三宮店 バナナ NaN NaN NaN 10 三宮店 みかん NaN NaN NaN となってしますので、もう少しgroupbyに関して勉強してみてこの書き方でも完成させるように勉強したいと思います! ありがとう御座いました!!
eqeqe

2021/05/11 14:08

bsdfanさん!こんにちは! あれからいただいたすべてのご意見を紐解くようにしていて自分なりに色々初心者で試行錯誤しながら書いてくださったコードを理解したらちゃんとかけました!今回の中で一番短いコードで汎用性も高いのでBAにしたいですが、すでにつけてしまってる方がいていきなり取り消すのも申し訳ないので今回は感謝をお伝えだけしようとコメントしました。 またアドバイスをお願いすることもあるとおもいますが是非よろしくお願い申し上げます!
bsdfan

2021/05/11 23:35

ご丁寧にありがとうございます。 ライブラリの機能をつかって簡単に実現するのではなく、自分でデータを実際に動かしていく方法を理解することを重視する場合は、今のBAでよいと思います。 プログラミングを覚えるには、両方大切なことです。
guest

0

店の名前順は変わっていますが、以下で一応できています。

python

1>>> print(df) 2 A B C D E 30 本 店 りんご NaN NaN NaN 41 本 店 バナナ NaN NaN NaN 52 本 店 みかん NaN NaN NaN 63 本 店 いちご NaN NaN NaN 74 芦屋店 バナナ NaN NaN NaN 85 西宮店 りんご NaN NaN NaN 96 西宮店 バナナ NaN NaN NaN 107 尼崎店 りんご NaN NaN NaN 118 三宮店 りんご NaN NaN NaN 129 三宮店 バナナ NaN NaN NaN 1310 三宮店 みかん NaN NaN NaN 14>>> count_dict = {} 15>>> def column_name(row): 16... if row['A'] in count_dict: 17... count = count_dict[row['A']] 18... else: 19... count = 0 20... count_dict[row['A']] = count + 1 21... return count 22... 23>>> df_temp = df.drop(['C', 'D', 'E'], axis=1).rename(columns={'B': '商品'}) 24>>> 25>>> df_temp['列名'] = df_temp.apply(column_name, axis=1) 26>>> 27>>> df_result = df_temp.pivot(index='A', columns='列名').reset_index() 28>>> df_result.columns = ['A', 'B', 'C', 'D', 'E'] 29>>> print(df_result) 30 A B C D E 310 三宮店 りんご バナナ みかん NaN 321 尼崎店 りんご NaN NaN NaN 332 本 店 りんご バナナ みかん いちご 343 芦屋店 バナナ NaN NaN NaN 354 西宮店 りんご バナナ NaN NaN

投稿2021/05/06 23:29

ppaul

総合スコア24666

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

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

eqeqe

2021/05/07 20:22 編集

ppaulさん、有難うございます!頂いたコードはpandas内でピボットを使うといったか考え方でOKでしょうか?! ただ実はこのままコピーさせていただいたら私の理解不足で ValueError: Index contains duplicate entries, cannot reshape が出てしまいました。 いずれにしても今後の勉強の一環として一度エクセルも含めてpandasでもピボット関連は勉強したいと思っていたところなので頂いたコードで、ちゃんとエラー回避できるように頑張ってみようかと思います。ありがとうございます、とても勉強になります!
guest

0

Pythonを使った方法ではありませんが、エクセルのピボットテーブルを活用すればミスなく作業可能かと思います。

<元データ>
イメージ説明

<ピボットテーブルで加工>
イメージ説明

<置換処理等で1を商品名に変更>
イメージ説明

<商品名を左詰めにする>
イメージ説明

投稿2021/05/06 17:07

meg_

総合スコア10579

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

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

eqeqe

2021/05/06 17:17 編集

おお!すごい。ありがとうございます!ピボットテーブルは使ったことがないので此方も目からうろこでしたが、できれば今後の自分のスキルアップのためにもPythonでの動作を希望しており、たどり着かなければmeg_様から教えていただいた方法を改めて調べてやってみます!ありがとうございます!
eqeqe

2021/05/18 14:08

こんばんは。一通りPYTHONで色々試し終わり、改めてmeg_さんが教えてくださったピボットを練習するためにやってみました。このままピボットをほかの事務作業でもかなり活用できそうだなと感じたので、改めてお礼申し上げたくコメントしました。ピボットは難しそうで避けていたのですが自分のやりたいことから入るとスッっと入ってきて驚きました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問