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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

1回答

376閲覧

Pandas DataFrameを使った表の作成。まったく違った表からの作成。または、Dataframeの任意の位置の値の更新を変数を使って。

kanchiru

総合スコア3

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

0クリップ

投稿2023/05/01 07:42

編集2023/05/01 07:46

実現したいこと

以下のようなデータがあります。

Python

1# A, B, D1 - D3, val値 2d = [ 3('AB', 'R1', 'D2', 3), 4('AB', 'R1', 'D2', 5), 5('AB', 'R2', 'D2', 10), 6('CA', 'S2', 'D3', 20), 7('TX', 'R1', 'D1', 30), 8('CA', 'S1', 'D3', 21), 9('TX', 'S1', 'D2', 33), 10]

次のようなDataframeを作りたいと考えています。
(一覧表csvを出力したいため)

ABD1D2D3D3
0ABR1NaN8NaN
1ABR2NaN10NaN
2CAS1NaNNaN21
3CAS2NaNNaN20
4TXR130NaNNaN
5TXS1NaN33NaN

一致するA,Bの行に、指定されたD1 - D3にval値を入れる。
同じA,B,D1 - D3の場合は、val値を加算して加える。
(A&Bの重複はありません)

質問

質問1
目的達成のための手段(方針)
下記の試したやり方よりももっとスマートな方法がありますか?

質問2(質問1答次第では不要なのですが、その答えとは別に教えてください)
下記ソースの引用テキストindexをqueryで取得して、df[x][y]で代入しようとしている部分を
どう直したら動くのでしょうか?

2次元配列を使ってゴリゴリやればできると思いますが、
できましたらPandas(またはNumpy)を使って、
Pandas(またはNumpyらしい)スマートな
やり方で表を作りたいと考えております。

以上、よろしくお願い致します。

該当のソースコード

Python

1d = [ 2('AB', 'R1', 'D2', 3), 3('AB', 'R1', 'D2', 5), 4('AB', 'R2', 'D2', 10), 5('CA', 'S2', 'D3', 20), 6('TX', 'R1', 'D1', 30), 7('CA', 'S1', 'D3', 21), 8('TX', 'S1', 'D2', 33), 9] 10 11df = pd.DataFrame(d, columns = ['A', 'B', 'd_type', 'value']) 12 13 14# 出力したい表の外枠を作ります 15 16## A,Bの重複を取り除いて、すべての行を作ります 17df2 = df[['A', 'B']] 18df2 = df2.drop_duplicates(subset=['A', 'B']) 19 20## df2にD1-D3列を追加 21df2['D1'] = np.nan 22df2['D2'] = np.nan 23df2['D3'] = np.nan 24 25 26# indexをqueryで取得して、df[x][y]で代入しようと考えました 27for a, b, d_type, value in d: 28 print(a, b, d_type, value) 29 30 idx = df2.query('a == @a').index[0] 31 df2[f"{d_type}"][f"{idx}"] += value 32 33 34# 出来上がったdf2をcsvに出力 35  (省略)

発生している問題・エラーメッセージ

上記ソースの引用テキストindexをqueryで取得して、df[x][y]で代入しようとしている部分が
Pandasをまだよく理解していないため、見当違いでエラーで動きません。

補足情報(FW/ツールのバージョンなど)

Python 3.11.2
pandas 1.5.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問1

Pivot table を使います。

python

1dfx = df.groupby(['A', 'B', 'd_type']).sum().reset_index(level='d_type')\ 2 .pivot(columns='d_type', values='value').reset_index().rename_axis(None, axis=1) 3 4print(dfx)
ABD1D2D3
ABR1NaN8NaN
ABR2NaN10NaN
CAS1NaNNaN21
CAS2NaNNaN20
TXR130NaNNaN
TXS1NaN33NaN

投稿2023/05/01 08:12

編集2023/05/01 09:01
melian

総合スコア20673

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

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

kanchiru

2023/05/01 09:12

たった一行でできるなんて、感動です。 ご教授、ありがとうございました。 いろいろ調べましたが、方針が見当違いでした。 どうpivotに辿り着けばよかったか、反省中です。 これをはげみに精進を続けたいと思います。 ちなみに、d_typeがD4,D5もあって、 (今回はたまたまD4,D5のデータはないですが) それらの列だけは作りたい時は、どうすれば良いでしょうか? (中身がNaNのD4,D5の2列をpd.concatする形ではなく)
melian

2023/05/01 09:17

はい、その場合は、 dfx[['D4', 'D5']] = np.nan とします。
kanchiru

2023/05/01 09:27

さっそくのご回答ありがとうございました。 たとえば、d_typeはD1 - D10まであって、 すべてD1 - D10の値があるわけではない場合、 しかし、 表はA, B, D1, D2, ... , D10と すべての列を出したい場合 スマートな方法はあるでしょうか? それとも、上記のように、手で任意の列?に、NaNのD?の列を挿入しなければならないでしょうか?
melian

2023/05/01 09:51

スマートではありませんが、以下の様になるかと思います。(列名をソートする部分が少し面倒です) cols = [f'D{i}' for i in range(1, 11) if f'D{i}' not in dfx.columns] dfx[cols] = np.nan dfx = dfx.reindex(sorted(dfx.columns, key=lambda i: int(i[1:]) if i.startswith('D') else -1), axis=1)
kanchiru

2023/05/02 01:16

空の列を作ってdataframeに付け足し、 そのあと列名columnsをソートですね。 columnsでの操作、大変参考になり、理解も深まりました。 今回のケースでなく、いろいろ応用を広げられそうです。 素晴らしいご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問