2016-05-03 8 views
2

現在の値の最初の文字に基づいて新しい値をデータフレーム列にマップする方法はありますか?pandas:最初の文字に基づいて新しい値をマップする

私の現在のコード:

ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('1'), 'city', ncesvars['urbantype']) 
ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('2'), 'suburban', ncesvars['urbantype']) 
ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('3'), 'town', ncesvars['urbantype']) 
ncesvars['urbantype'] = np.where(ncesvars['urbantype'].str.startswith('4'), 'rural', ncesvars['urbantype']) 

私は.str.startswith()

答えて

2

あなたは、あなたのカテゴリの辞書を定義するデータをスライスするstr[0:1]を使用してのみ一致しますが、そうでない場合は、あなたが上書きされるように、データの最初の文字はあなたのdictのキーであるかどうかをテストすることによって、あなたのSeriesのブールマスクにmapを呼び出すことができます入力用

In [16]: 
df = pd.DataFrame({'urbantype':['1 asdas','2 asd','3 asds','4 asdssd','5 asdas']}) 
df 

Out[16]: 
    urbantype 
0 1 asdas 
1  2 asd 
2 3 asds 
3 4 asdssd 
4 5 asdas 

In [18]: 
d = {'1':'city','2':'suburban', '3': 'town','4':'rural'} 
df.loc[df['urbantype'].str[0:1].isin(d.keys()), 'urbantype'] = df['urbantype'].str[0:1].map(d) 
df 

Out[18]: 
    urbantype 
0  city 
1 suburban 
2  town 
3  rural 
4 5 asdas 
+0

入力していただきありがとうございます。 @ ayhanの答えと比較して、 'df.loc'の部分が重要ですか? – As3adTintin

+1

はい、データがあなたのdictキーと一致する行だけに影響を与えたいので、そうでなければ 'NaN'でその行を上書きします。これが最後の行が変更されていない理由です – EdChum

+0

ahhhありがとう! – As3adTintin

3

とに似て何かしようとしていることdictのいくつかの並べ替えを使用してのことを考え、その後pd.replace、しかし行う方法がわからないとした。

ncesvars['urbantype'] = ncesvars['urbantype'].replace({ 
    r'^1.*', 'city', 
    r'^2.*', 'suburban'}, 
    regex=True) 

テスト:

In [32]: w 
Out[32]: 
    word 
0 1_A_ 
1 word03 
2 word02 
3 word00 
4 2xxx 
5 word04 
6 word01 
7 word02 
8 word04 
9 3aaa 

In [33]: w['word'].replace({r'^1.*': 'city', r'^2.*': 'suburban', r'^3.*': 'town'}, regex=True) 
Out[33]: 
0  city 
1  word03 
2  word02 
3  word00 
4 suburban 
5  word04 
6  word01 
7  word02 
8  word04 
9  town 
Name: word, dtype: object 
+0

おかげ:次の例の最後の行のマッピングが存在しないようにNaNで上書き。私はerorr 'replace()に予期しないキーワード引数 'regex'があり、' regex'引数なしで試してみると 'replace()は少なくとも3つの引数をとります(2が与えられます)' – As3adTintin

+0

は動作しません私にとっても、私は元の値を受け取ります – As3adTintin

+0

@ As3adTintin、私はテストケースを追加しました – MaxU

関連する問題