2016-08-24 1 views
1

私はまだ初心者ですが、ExcelでCSVファイルを操作する同僚にファンダのファンダメンタルズを説明しようとしています。Python Pandas - 複数の列に姓と名を入れた新しい列を追加する

私は、例として使用したい問題を解決するための「良い」答えを見つける能力を持って壁に当たった。

私はCSVは、このようなファイルがあります:私は「StartsWithJOrK」と呼ばれるdfに新しい列を追加したい

import pandas 
df = pandas.read_csv('C:\\example.csv') 

"Id","First","Last" 
"109","Karl","Evans" 
"113","Louise","Hudson" 
"106","Catherine","Johnson" 

と私はこのようなパイソンにインポートしています。

"Yay!"と言ってください。 lowercase-last-nameが "j"または "k"で始まる小文字の最初の名前ORの誰かのために。小文字名が "j"か "k"で始まっていない人にとっては、 "BooHiss"と言うべきです。

(それはむしろ、神経が高ぶった例だが、それは私が行う方法を知っていないか、組み合わせる方法がわからないのいずれかのものの多くのパックのように私は感じる「pythonically。」)

これを行うには、最もpythonの、最も少ないコード行の方法は何ですか?

答えて

2

ないパンダへの最も簡単な紹介...

df['StartsWithJorK'] = 'BooHiss' 
starting_letters = ['j', 'k'] 
df.loc[(df.First.str[0].str.lower().isin(starting_letters)) | 
     df.Last.str[0].str.lower().isin(starting_letters), 'StartsWithJorK'] = 'Yay!' 

>>> df 
    Id  First  Last StartsWithJorK 
0 109  Karl Evans   Yay! 
1 113  Louise Hudson  BooHiss 
2 106 Catherine Johnson   Yay! 

df.First.str[0]は、名前の最初の文字を検索します。

.str.lower()は、この一連の文字を小文字に変換します。

.isin(starting_letters)チェック各小文字は、文字を開始する、すなわち、「J」と「K」の私たちのリストにある場合。

.loclabel and boolean based indexingであり、ここで列StartsWithJorKは、一致条件ごとにYay!に設定されている。

+0

ありがとう:.str.lower()のアレクサンダーの答えの使用@からヒントを取って、

mask = (df[['First', 'Last']] .apply(lambda x: x.str.match('[JjKk]'), axis=1) .any(axis=1)) 

または:ここでは1です。私はそれが「そう簡単ではない」ので、私は理解することは、いくつかのビルディングブロックに離れて、それを取り除くことができました。あなたが気にしないなら、フォローアップの質問。のは、それが「ジョー・エヴァンス、」ない「カール・エヴァンス、」だったと私はちょうど「StartsWithJ」欄をやってみたかったとしましょう。 (それでも「最初または最後」。)その操作を行うための最も神託/簡潔な方法は、df.loc [(df.First.str.lower() 'のような第三のラインを持っているだろう。str.startswith(「J」 ))| df.Last.str.lower()。str。startswith( 'j')、 'StartsWithJ'] = 'Yay''、またはさらに簡単なアプローチがありますか?私は、質問がより簡単になったときに、パンダのソリューションが頻繁に**完全に**変化することに気付きました。 –

+1

私にはうまく見えますが、誰かがもっと簡単な方法を見つけるでしょう。この場合、 'df.First.str [0] .str.lower()== 'k'' – Alexander

2

あなたもnumpyをインポートする気にしない場合、あなたは

import numpy as np 
import pandas as pd 

mask = df['Last'].str.match('[JjKk]') | df['First'].str.match('[JjKk]') 
df['StartsWithJOrK'] = np.where(mask, 'Yay!', 'BooHiss') 

出力を行うことができます。

Id  First  Last StartsWithJOrK 
0 109  Karl Evans   Yay! 
1 113  Louise Hudson  BooHiss 
2 106 Catherine Johnson   Yay! 

を上記maskを作成する他の方法があります。

mask = (df[['First', 'Last']] 
      .apply(lambda x: x.str.lower().str.match('[jk]'), axis=1) 
      .any(axis=1)) 
+0

を使ってはいけません.startswith?または.str.match('^[JjKk] ') ?私はあなたの例の中のマッチはどんな地位の手紙のためにも発砲することを理解していますか? –

+1

'Series.str.startwith'は正規表現を受け入れないので、' j'、 'J'、' k'と 'K'をそれぞれチェックする必要があります。 'Series.str.match'は' re.match'と同様に文字列の先頭にのみ一致します。 –

+0

私は同意しますが、regexpは.str.match( '^ [JjKk]')でなければなりません。 –

関連する問題