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

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

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

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

pandas

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

Q&A

解決済

2回答

4969閲覧

pandas 複数の列からの条件付コピー

horiegom

総合スコア152

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2018/06/01 07:51

編集2018/06/01 08:15

python 3.5
pandas 0.22.0において

AUSJP
01422
newyork1422
newyork1522
tokyo1523
london1523

という元のDataFrameがある場合に、
Aの列の値に応じて、C1列,C2列の値を参照して新たなX列を作りたい

つまり
AがnewyorkであればUS列の値をX列に
AがtokyoであればJP列の値をX列に
したいです。

|A|US|JP|X|
|:--|:--:|--:|
|0|14|22||
|newyork|14|22|14|
|newyork|15|22|15|
|tokyo|15|23|23|
|london|15|23||

同様の質問は以下にもありますが、やや異なります。
https://teratail.com/questions/62152

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

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

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

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

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

guest

回答2

0

ベストアンサー

求めたい値を返す関数を定義し、.apply(関数, axis=1)で行毎に処理すればよいです。

Python

1import pandas as pd 2df = pd.DataFrame({'A':['','newyork','newyork','tokyo','london'],'US':[14,14,15,15,15],'JP':[22,22,22,23,23]}) 3print(df) 4 5def getX( df): 6 if df['A'] == 'newyork': 7 return df['US'] 8 elif df['A'] == 'tokyo': 9 return df['JP'] 10 # 該当なしはNone(NaN)でいいかな 11 12df['X'] = df.apply( getX, axis=1) 13print(df)

投稿2018/06/01 08:28

編集2018/06/01 08:29
can110

総合スコア38266

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

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

horiegom

2018/06/01 09:09

なるほど! ありがとうございます。求めていた動作が実現できそうです。 月曜日に確認してBAにさせていただきます。
guest

0

一応書いて見ましたが、これでよいのでしょうか?

import pandas as pd import io data = """A,C1,C2 0,14,22 1,14,22 1,15,22 2,15,23 3,15,23 """ df = pd.read_csv(io.StringIO(data)) df['X'] = df.apply(lambda r: r.get('C{}'.format(r.A)), axis=1) print(df) # A C1 C2 X #0 0 14 22 NaN #1 1 14 22 14.0 #2 1 15 22 15.0 #3 2 15 23 23.0 #4 3 15 23 NaN

【修正分】

Python

1import pandas as pd 2import io 3 4data = """A,US,JP 50,14,22 6newyork,14,22 7newyork,15,22 8tokyo,15,23 9london,15,23 10""" 11 12df = pd.read_csv(io.StringIO(data)) 13conv = {'newyork': 'US', 'tokyo': 'JP', 'London':'UK'} 14df['X'] = df.apply(lambda r: r.get(conv.get(r.A)), axis=1) 15print(df) 16# A US JP X 17#0 0 14 22 NaN 18#1 newyork 14 22 14.0 19#2 newyork 15 22 15.0 20#3 tokyo 15 23 23.0 21#4 london 15 23 NaN

投稿2018/06/01 08:04

編集2018/06/01 08:34
magichan

総合スコア15898

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

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

horiegom

2018/06/01 08:17

ご回答ありがとうございます。 途中で内容を変えて申し訳ないのですが、簡略化して表記していましたが 実際には1・2がそのままC1列、C2列に対応するものではないので変更させていただきました。 この場合、 r: r.get('C{}'.format(r.A)), axis=1 をどのように記述すればよろしいでしょうか。
magichan

2018/06/01 08:17

ん?質問変わってる?
magichan

2018/06/01 08:22

修正を書きますので、ちょっとお待ちを
magichan

2018/06/01 08:35

書きました。 変換用のDictを準備するとよいかと思います。
horiegom

2018/06/05 00:34

ご回答ありがとうございました。 無事動作いたしました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問