2017-10-11 7 views
3

は実際には、私の問題は、に基づいています。pd.get_dummiesやその他の方法は?

Is there a faster way to update dataframe column values based on conditions?

ので、データは次のようになります。

import pandas as pd 
import io 
t=""" 
AV4MdG6Ihowv-SKBN_nB DTP,FOOD 
AV4Mc2vNhowv-SKBN_Rn Cash 1,FOOD 
AV4MeisikOpWpLdepWy6 DTP,Bar 
AV4MeRh6howv-SKBOBOn Cash 1,FOOD 
AV4Mezwchowv-SKBOB_S DTOT,Bar 
AV4MeB7yhowv-SKBOA5b DTP,Bar 
""" 
data_vec=pd.read_csv(io.StringIO(t),sep='\s{2,}',names=['id','source']) 
data_vec 

これはdata_vecです:

id source 
0 AV4MdG6Ihowv-SKBN_nB DTP,FOOD 
1 AV4Mc2vNhowv-SKBN_Rn Cash 1,FOOD 
2 AV4MeisikOpWpLdepWy6 DTP,Bar 
3 AV4MeRh6howv-SKBOBOn Cash 1,FOOD 
4 AV4Mezwchowv-SKBOB_S DTOT,Bar 
5 AV4MeB7yhowv-SKBOA5b DTP,Bar 

私がしたい場合次のような結果が返されます:(これはmutipletagsまたはカテゴリをベクトル化する方法を意味します)

    _id source_Cash 1 source_DTOT source_DTP Food Bar 
0 AV4MdG6Ihowv-SKBN_nB    0   0  1  1 0 
1 AV4Mc2vNhowv-SKBN_Rn    1   0  0  1 0 
2 AV4MeisikOpWpLdepWy6    0   0  1  0 1 
3 AV4MeRh6howv-SKBOBOn    1   0  0  1 0 
4 AV4Mezwchowv-SKBOB_S    0   1  0  0 1 
5 AV4MeB7yhowv-SKBOA5b    0   0  1  0 1 

重複している場合は、削除するように警告してください。

+1

複製を、私は知りません。とにかく、 'get_dummies'は複数の値を扱うセパレータを取ります:' data_vec.source.str.get_dummies(sep = '、') ' – JohnE

+1

@JohnEあなたのコメントありがとう、私は何か新しいことを学んだ!セパレータについて知りませんでした。 –

+0

私も!@ジョン@コスプレッド – ileadall42

答えて

5

ビットがstr.splitおよびpd.get_dummiesの魔法、inspired by Scott Bostonおよび改善された(元のバージョンから)thanks to JohnEです。

df = df.set_index('id').source.str.get_dummies(',') 
df.columns = df.columns.str.split().str[0].str.lower() 
df = df.add_prefix('source_').reset_index() 

print(df) 
        id source_bar source_cash source_dtot source_dtp \ 
0 AV4MdG6Ihowv-SKBN_nB   0   0   0   1 
1 AV4Mc2vNhowv-SKBN_Rn   0   1   0   0 
2 AV4MeisikOpWpLdepWy6   1   0   0   1 
3 AV4MeRh6howv-SKBOBOn   0   1   0   0 
4 AV4Mezwchowv-SKBOB_S   1   0   1   0 
5 AV4MeB7yhowv-SKBOA5b   1   0   0   1 

    source_food 
0   1 
1   1 
2   0 
3   1 
4   0 
5   0 
1

また、これを行うことができます: 私は何をやっていることは、「ソース」列を分割し、新しいrows.Thenを作成している私はGROUPBY「ID」欄、その後、ソース列にget_dummiesを呼び出します。

data_vec = pd.DataFrame(pd.concat([pd.Series(row['id'], row['source'].split(','))    
        for _, row in data_vec.iterrows()])).reset_index() 
data_vec.columns = ['source','id'] 

与える:

result = pd.concat([data_vec.get(['id']), 
          pd.get_dummies(data_vec['source'], prefix='source')],axis=1) 

result.groupby('id').sum().reset_index() 

います:

source   id 
0 DTP  AV4MdG6Ihowv-SKBN_nB 
1 FOOD AV4MdG6Ihowv-SKBN_nB 
2 Cash 1 AV4Mc2vNhowv-SKBN_Rn 
3 FOOD AV4Mc2vNhowv-SKBN_Rn 
4 DTP  AV4MeisikOpWpLdepWy6 
5 Bar  AV4MeisikOpWpLdepWy6 
6 Cash 1 AV4MeRh6howv-SKBOBOn 
7 FOOD AV4MeRh6howv-SKBOBOn 
8 DTOT AV4Mezwchowv-SKBOB_S 
9 Bar  AV4Mezwchowv-SKBOB_S 
10 DTP  AV4MeB7yhowv-SKBOA5b 
11 Bar  AV4MeB7yhowv-SKBOA5b 

、ソース列にget_dummies()を呼び出し、おそらく

  id   source_Bar source_Cash 1 source_DTOT source_DTP source_FOOD 
0 AV4Mc2vNhowv-SKBN_Rn 0    1    0  0   1 
1 AV4MdG6Ihowv-SKBN_nB 0    0    0  1   1 
2 AV4MeB7yhowv-SKBOA5b 1    0    0  1   0 
3 AV4MeRh6howv-SKBOBOn 0    1    0  0   1 
4 AV4MeisikOpWpLdepWy6 1    0    0  1   0 
5 AV4Mezwchowv-SKBOB_S 1    0    1  0   0 
+0

このようにすれば、カンマとスタックで分けることができます。しかし、これをすべて行うことなく '' pd.get_dummies'を直接呼び出すだけで(https://stackoverflow.com/a/46679500/4909087)、はるかに簡単になりますが、これは不必要に複雑です。 –

+0

私は同意します。今日、新しいことを学び、get_dummies()をカンマを付けて呼び出すことができました。 – Gayatri

関連する問題