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

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

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

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

Q&A

解決済

1回答

127閲覧

Pandas DataFrameの列操作方法「B列のある値がC列のある値と同じだったとき、そのC列のある値をD列になるリストへ追記していく」

goki_gottan

総合スコア168

pandas

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

0グッド

0クリップ

投稿2019/04/12 16:27

編集2019/04/12 17:05

10行3列のDataFrameがあったとします。
カラム名をA,B,Cとします。
C列のある行(3行とする)の値が、B列のある行(8行とする)の値と同じだったとき、A列の8行の値をD列の3行へ追加する、という感じのプログラムを考えております。
ちなみに、C列の最初から最後まで実行しますので、実際には1行目へ追加される形となります。
dfをDataFrameとして、

value_a = df["A"].value value_c = df["C"].value value_b = df["B"].value value_d=[] m = 0 for value1 in value_c: for value2 in value_b: if value1 ==value2: d = value_a[m] value_d.append(d) break      m= m + 1 if d == "": value_d.append("N")

最終的に、このvalue_dを追加して、10行4列のDataFrameとしたいですが、
上記コードよりもっと簡潔なコードはないでしょうか。

宜しくお願いします。

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

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

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

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

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

kou0179

2019/04/12 16:59

ある特定の1列において等しい行が3行以上あった場合の処理はどうしますか?
goki_gottan

2019/04/12 17:03

すみません、先ほどのコード間違えておりました。再度修正いたしました。 3行あった場合でも、3行とも同じになるはずですので、最初に見つけた行、もしくは若い行でお願いします。
kou0179

2019/04/12 17:14 編集

ID(A列) 名前(B列) 好きな人(C列) 1    斎藤    北村 2    北村    斎藤 3    小林    北村 こんなDFがあった場合、  ID(A列) 名前(B列) 好きな人(C列) 好かれてる人(D列) 1    斎藤    北村      2 2    北村    斎藤      1,3 3    小林    北村 A列の値を追加するので、比較する物はまったく同じ物ですが、D列に入ってくる内容(その行の実態)はまったく異なるので、重複しますが、本当に若い行だけで良いのですか?
goki_gottan

2019/04/12 19:40 編集

ありがとうございます。A列とB列はリンクしており、絶対にB列がある値だったらA列もある値をとります。 ID(A列) 名前(B列) 好きな人(C列) 好かれてる人(D列) 1    斎藤    北村      2 2    北村    斎藤      1 3    小林    北村      N A列とB列はリンクするように集計するため、 B列に同じものが複数あろうがA列はつねに同じものしかこないです。 私のコードを見ていただければお分かりなられるかと思いますが、D列はかならず、1行目から追加され、歯抜けはありません。私のコード以外にないでしょうか。 Pandasのデータフレームの参照能力の実力を知りたいためです。
guest

回答1

0

ベストアンサー

B列とC列が1:1で対応しているのであれば、ループ処理をすることなく DataFrame.merge() で処理することができるかと思います。

Python

1import pandas as pd 2df = pd.DataFrame( 3 [[1,'あ','え'], 4 [2,'い','う'], 5 [3,'う','い'], 6 [4,'え','あ']], 7 columns=['A','B','C']) 8# A B C 9#0 1 あ え 10#1 2 い う 11#2 3 う い 12#3 4 え あ 13 14ret =df[['A','B','C']].merge(df[['C','A']].rename(columns={'C':'B','A':'D'}), on='B', how='left') 15# A B C D 16#0 1 あ え 4 17#1 2 い う 3 18#2 3 う い 2 19#3 4 え あ 1

投稿2019/04/13 02:40

magichan

総合スコア15898

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

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

goki_gottan

2019/04/13 02:53

ありがとうございます。やはり、あるのですね。 ベストアンサーにする前に、1つ教えてください。A,Bはリンクしているのですが、 BとCで共通しないものがあり、その場合はD列に、たとえばNを入れるという事もできますでしょうか。
magichan

2019/04/13 04:25

C列に存在するのにB列に無い場合上記のコードではD列はNaNになるかと思いますので fillna() を使ってNに変換すると良いかと思います
kou0179

2019/04/13 04:28

横から失礼いたします。 magichan様掲載のコードでjoinすれば、当てはまらないD列(空行D列)には、欠損値NaNが入りますので、後から任意の文字、数字に埋める事は容易です。
goki_gottan

2019/04/13 04:57

なるほど。ありがとうございます。 しかし、10行4列で試したところ、できませんでした。 B列のものがC列と同じだったとき、D列をE列に追記するというさっきとちょっと変わってはおりますが・・・ ret =df[['A','B','C','D']].merge(total[['B','D']].rename(columns={'B':'C','D':'E'}), on='C', how='left') なにがいけないのでしょうか。
magichan

2019/04/14 23:46

スミマセン。遅くなりました。 どのように「できなかった」のでしょうか? その場合、'N'への変換部も含めると ret =df[['A','B','C','D']].merge(df[['B','D']].rename(columns={'B':'C','D':'E'}), on='C', how='left').fillna('N') でいけると思うのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問