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

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

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

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

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

pandas

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

Q&A

解決済

1回答

401閲覧

データフレームの空白に条件次第で値を追加したい

F91_

総合スコア16

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

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

pandas

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

0グッド

0クリップ

投稿2022/08/03 13:25

編集2022/08/03 14:04

前提

pythonのpandasでエクセル集計をしていますが、空白に条件次第で値を追加した上で集計が必要です。
何日か悩んでおりますが、どのような方法があるのかわからず、解決出来ません・・・
申し訳ございませんがお力添えいただけないでしょうか。
sqlやqueryで条件によるデータ抽出を試しましたが、
抽出が上手くいかず、pythonで書き込みが一番早いかと思っております。

実現したいこと

製番カラムの数字が同じだった場合に、
部門カラムの空白に、同じ製番カラムに入力されている部門カラムの数字を入れたい。
文章ではわかりづらいと思いますので画像にて例を添付します。
イメージ説明

###試したコード

df2=df1.groupby(["加工日","部門","品目"]).sum()[["受入数"]]
df2.to_excel("C:/Users/yokoc/Desktop/完成量.xlsx")

部門でグループピングしているので空白となってしまっていると
受入数の合計にカウントされません・・・
部門に製番と同様の部門番号が入れば部門毎の合計数量が算出出来ます。

###調べたこと
主にデータ抽出方法の変更を調べました。
①SQLを使用し、データを持ってくる方法を変更する
②python queryを使用し、データの抽出方法を変更する

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

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

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

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

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

melian

2022/08/03 13:30

製番でグルーピングして部門列を bfill() すればよいのかなと思います。
meg_

2022/08/03 13:46

> 何日か悩んでおりますが、 調べたこと、試したコード等ありませんか?
guest

回答1

0

ベストアンサー

python

1import pandas as pd 2import io 3 4pd.set_option('display.unicode.east_asian_width', True) 5 6csv_data = ''' 7製番,品目,部門 862206136,2B, 962206136,2B,62107 1062206136,2B,62107 1162206137,2B, 1262206137,2B, 1362206137,2B,62108 1462206137,2B,62108 1562206137,2B,62108 1662206137,2B,62108 1762206137,2B,62108 1862206137,2B,62108 1962206137,2B,62108 2062206137,2B,62108 2162206138,2B, 2262206138,2B,67201 2362206138,2B,67201 24''' 25df = pd.read_csv(io.StringIO(csv_data)) 26 27# 28df['部門'] = df.groupby('製番')['部門'].bfill().astype(int) 29print(df)
製番品目部門
622061362B62107
622061362B62107
622061362B62107
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061372B62108
622061382B67201
622061382B67201
622061382B67201

投稿2022/08/03 15:37

melian

総合スコア19798

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

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

F91_

2022/08/04 13:12

ValueError: cannot convert float NaN to integerのエラーが出てきますので、 調べた所、astype(int)の所でデータ型が一致しなくなっていると思います。 以下が使用コードです。 df2 = pd.read_csv("C:/Users/yokoc/Desktop/出庫.csv",dtype=object,encoding="cp932") df2["加工日"]=pd.to_datetime(df2["加工日"])#日付が文字列なので日付型へ変換 df2["加工日"]=df2["加工日"].dt.strftime("%Y%m")#月へ変換 dtに注意 df2['完成部門コード'] = df2.groupby('製番(ロット番号)')['完成部門コード'].bfill().astype(int)
melian

2022/08/04 13:14

では astype(int) を削るとよいかとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問