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

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

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

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

pandas

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

Q&A

解決済

1回答

1006閲覧

pythonのDataFrameでのデータの紐付け

hamage

総合スコア1

Python

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

pandas

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

0グッド

0クリップ

投稿2020/11/01 00:16

前提・実現したいこと

pythonのDataFrameでデータ分析前の前処理をしています。
下記のようなDFのA1,A2,A3,A4列とB1,B2,B3列からC1、C2、C3列を作成したいのですが、うまくできません。(下記は実現後のdfの状態です)

indexA1A2A3A4B1B2B3C1C2C3
01100011021
11100011021
20110110320
30111111432
41110111321
51110111321

実現したいことの補足

・A1〜A4で行毎の1が立っている数とB1〜B3で行毎の1が立っている数は必ず合致します。
・A1〜A4は老番から順に、B1〜B3は若番から順に紐づきます。(それぞれ1が立っているデータが紐づく)
・紐づいたAの番号をC1〜C3に代入します。

試したこと

下記でうまくいかないのは、始めに全ての列に数値が入るためということは、わかりますが、どうしたらいいのかわかりません。

for i in range(df.shape[0]): for j in range(4,7): for k in range(0,4)[::-1]: if df.iloc[i,j] == 1 and df.iloc[i,k] == 1: if df.iloc[i,j+3] == 0: df.iloc[i,j+3] = k+1

ご回答のほど、よろしくお願いします。

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

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

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

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

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

Daregada

2020/11/01 00:31

説明が不足していて、読んでいる人には「どのような処理を行なうのか」が伝わっていないのだと思います。 > 紐づいたAの番号をC1〜C3に代入します。 B1~B3にそれぞれ紐付いたAn (nは1~4)のnを、Bm (mは1~3)と同じ番号のCm (mは1~3)に代入する、ということでいいのかな?
guest

回答1

0

ベストアンサー

少し意図の解読が困難でしたが、こんな感じでできます。

以下の流れです。

  • 行の中だけを注目すればよいので、agg(axis=1)により行単位の処理に分解します。
  • A列の「重み」を考慮して、ゼロを削除したリストA_listを作ります。
  • B列を参照しつつ、C列に値を入れていきます。その際に、B列がゼロでなければA_listの最後から順に値を取り出して、それをC列に入れます。

Python

1import pandas as pd 2import io 3 4data = ''' 5A1 A2 A3 A4 B1 B2 B3 61 1 0 0 0 1 1 71 1 0 0 0 1 1 80 1 1 0 1 1 0 90 1 1 1 1 1 1 101 1 1 0 1 1 1 111 1 1 0 1 1 1 12''' 13 14df = pd.read_csv(io.StringIO(data.replace(' ', ','))) 15 16def calc_C(row): 17 A_list = [x*(i+1) for i, x in enumerate(row['A1':'A4']) if x>0] 18 for B_col, C_col in zip(['B1', 'B2', 'B3'], ['C1', 'C2', 'C3']): 19 row[C_col] = A_list.pop() if row[B_col] == 1 else 0 20 return row 21 22df = df.agg(calc_C, axis=1) 23print(df)

投稿2020/11/01 02:15

toast-uz

総合スコア3266

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

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

hamage

2020/11/01 02:46

ありがとうございます!助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問