LoginSignup
TMnekoneko
@TMnekoneko

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonによる一覧表の改変方法について

Q&AClosed

解決したいこと

ここに解決したい内容を記載してください。

下図、左の表のように、材料の種類・量をまとめたエクセルファイルがあります。
これを右の表のように、各要素ごとに抽出して並べ替えたいと思っています。

image.png
今あるデータ 作り直したいデータ
No. 材料1 量 材料2 量 ・・・ No. A B C 甲 乙 丙 丁 ・・・
1 A 100 甲 5 1 100 0 0 5 0 0 0
2 A 200 乙 2 2 200 0 0 0 2 0 0
3 B 50 丙 3 3 0 50 0 0 0 3 0
4 C 100 丁 7 4 0 0 100 0 0 0 7
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・

pd.read_excelにてDataFrameとして読み込むことは出来ました。
欠測値はdf.fillna(0)にて補完しようと思いますが、
肝心の行列の入れ替えや、
材料ごとに列を作って、そこに該当する量を入力する方法が全く検討つかず、
アドバイスを頂ければと思います。
よろしくお願いいたします。

少し調べて、pivot_tableが使えそうな気もしたのですが、
以下のように記載すると(甲乙丙丁をD,E,F,Gに変更)、
ちょっと意図したものとは違ってしまいます。
(出力結果)
量1_A 量1_B 量1_C 量2_A 量2_B 量2_C
No.
1 100 0 0 5 0 0
2 200 0 0 2 0 0
3 0 50 0 0 3 0
4 0 0 100 0 0 7


# もとのデータを作成
data = {
    'No.': [1, 2, 3, 4],
    '材料1': ['A', 'A', 'B', 'C'],
    '量1': [100, 200, 50, 100],
    '材料2': ['D', 'E', 'F', 'G'],
    '量2': [5, 2, 3, 7]
}

df = pd.DataFrame(data)

# 新しいデータフレームを作成
new_df = pd.pivot_table(df, values=['量1', '量2'], index='No.', columns='材料1', aggfunc='sum', fill_value=0)

# 列名の整理
new_df.columns = [f'{col[0]}_{col[1]}' for col in new_df.columns]

# 結果の表示
print(new_df)
0

1Answer

2列ずつpivot tableを作成し、最後に pd.DataFrame を使って連結するのはいかがでしょうか.
以下,質問における「もとのデータを作成」を引用したコード例です:

import pandas as pd


# もとのデータを作成
data = {
    'No.': [1, 2, 3, 4],
    '材料1': ['A', 'A', 'B', 'C'],
    '量1': [100, 200, 50, 100],
    '材料2': ['D', 'E', 'F', 'G'],
    '量2': [5, 2, 3, 7],
}

print(pd.DataFrame(data))

df = pd.DataFrame(data).set_index('No.')

pivot_list = []

for c_idx in range(0, len(df.columns)//2):
    # 2列ずつ分割してpivot tableを作成
    _df_split = df.iloc[:, 2 * c_idx:2*c_idx+2]

    # renameメソッドによってカラム名「量*」を除去
    _df_pivot = _df_split.pivot_table(values=[f'{c_idx+1}'],
                                      index='No.',
                                      columns=f'材料{c_idx+1}',
                                      aggfunc='sum',
                                      fill_value=0).rename(columns={f'{c_idx+1}':''})
    pivot_list.append(_df_pivot)

print(pd.concat(pivot_list, axis=1))

最後のprint文で以下が出力されるはずです:

       A   B    C  D  E  F  G
No.                          
1    100   0    0  5  0  0  0
2    200   0    0  0  2  0  0
3      0  50    0  0  0  3  0
4      0   0  100  0  0  0  7

以下を参考に回答しております:

0

Comments

  1. @TMnekoneko

    Questioner

    お返事が遅れまして大変申し訳ございません。
    ご回答頂き有難うございました。
    参考にしてコードを書き直してみます。

Your answer might help someone💌