pandas における index 番号と対象列を別データフレームとして指定してのデータフレーム変換

投稿者: Anonymous

pandasのデータフレームで変換するためのプログラムを書こうと試みていますが、うまくいきません。

masterという名前のデータフレームにidごとにどの変数をどう上書きするか、の対応が入っています。

id,上書き列名,上書き文字列
1,x2,ああああ
2,x4,いいい

dfというデータフレームをmasterの対応を用いて変換したいです。
(ちなみにdfの全サンプルを変換するのではなく、masterに乗っているidのみを変換します。
=len(df)>len(master)
また、masterのidは重複の可能性があります。
=1つのidに対してx2とx54に対する変換が生じる可能性がある。)
以下がdfの例です。

id,x1,x2,...,x345
1,あいう,かかか, ...,きくけ,

dfを以下のようなif文を使って書き換えたいです。
(masterテーブルに習い、id=1のときはx2をああああに、id=2のときはx4をいいいに、という感じです。)

if id == master.id:
    df.x1 = df.x1.上書き文字列

変換する変数と書き込む文字列、のように組が二つだと辞書が使えるのですが、3つの変数(id、上書き変数名、上書き文字列)が必要なので辞書が使えない状況です。
(辞書が使えればfor i,j in items()でループさせられる。)
リストで3つごとにループさせるくらいしか思いつかないですが、他に良い方法はありますでしょうか。
よろしくお願いいたします。

解決

データフレーム masterid上書き列名 でグループ化して pivot します。その後、pivot した master データフレームで df を更新(pandas.DataFrame.update())します。

import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)

master = pd.DataFrame({
  'id': [1, 2, 2, 1],
  '上書き列名': ['x2', 'x4', 'x6', 'x1'],
  '上書き文字列': ['ああああ', 'いいい', 'ううううう', 'んん']
})

df = pd.DataFrame({
  'id': [1, 2],
  'x1': ['あ', 'あ'],
  'x2': ['い', 'い'],
  'x3': ['う', 'う'],
  'x4': ['え', 'え'],
  'x5': ['お', 'お'],
  'x6': ['か', 'き'],
})

print(master)
#    id 上書き列名 上書き文字列
# 0   1       x2     ああああ
# 1   2       x4      いいい
# 2   2       x6   ううううう
# 3   1       x1        んん

print(df)
#    id  x1  x2  x3  x4  x5  x6
# 0   1  あ   い  う  え   お  か
# 1   2  あ   い  う  え   お  き

df.update(
  master.groupby(['id', '上書き列名'])['上書き文字列']
  .first().unstack().reset_index()
)

print(df)
#    id    x1       x2  x3    x4   x5       x6
# 0   1   んん  ああああ  う     え   お        か
# 1   2     あ       い  う  いいい  お  ううううう
回答者: Anonymous

Leave a Reply

Your email address will not be published.