簡體   English   中英

Pandas - get_dummies 與選定的集合

[英]Pandas - get_dummies with a selected set

使用以下數據幀:

>>> df = pd.DataFrame(data={'category':['a','b','c'],'val':[1,2,3]})
>>> df
  category  val
0        a    1
1        b    2
2        c    3

我正在連接生成的虛擬列並刪除原始列,如下所示:

>>> df = pd.concat([df, pd.get_dummies(df['category'], prefix='cat')], axis=1).drop(['category'], axis=1)
>>> df
   val  cat_a  cat_b  cat_c
0    1      1      0      0
1    2      0      1      0
2    3      0      0      1

然后我為未來的未知值添加另一列,如下所示:

>>> df['cat_unkown'] = 0
>>> df
   val  cat_a  cat_b  cat_c  cat_unkown
0    1      1      0      0           0
1    2      0      1      0           0
2    3      0      0      1           0

現在我想在新的 DataFrame 上 get_dummies,但將其映射到可用列,這意味着:如果存在類別列,則使用它,否則將 cat_unkown 設置為 1

例如對於以下數據幀:

  category  val
0        a    1
1        b    2
2        d    3

結果將是:

   val  cat_a  cat_b  cat_c  cat_unkonw
0    1      1      0      0           0
1    2      0      1      0           0
2    3      0      0      0           1

什么是一種有效的方法來做到這一點?

更新:只是詳細說明一下,在我的實際問題中,我在 get_dummies 產生結果后有數據幀。

我相信你需要:

df = pd.DataFrame(data={'category':['a','b','c'],'val':[1,2,3]})  
df = pd.concat([df, pd.get_dummies(df['category'], prefix='cat')], axis=1).drop(['category'], axis=1)  
df['cat_unkown'] = 0
print (df)
   val  cat_a  cat_b  cat_c  cat_unkown
0    1      1      0      0           0
1    2      0      1      0           0
2    3      0      0      1           0

df1 = pd.DataFrame(data={'category':['a','b','d'],'val':[1,2,3]})    
df1 = pd.concat([df1, pd.get_dummies(df1['category'], prefix='cat')], axis=1).drop(['category'], axis=1)  
print (df1)
   val  cat_a  cat_b  cat_d
0    1      1      0      0
1    2      0      1      0
2    3      0      0      1

#get all columns names without val
orig_cols = df.columns.difference(['val'])
print (orig_cols)
Index(['cat_a', 'cat_b', 'cat_c', 'cat_unkown'], dtype='object')

 #create dictionary with all columns from df1 which are not in df (also removed vals column)
dif = dict.fromkeys(df1.columns.difference(['val'] + orig_cols.tolist()), 'cat_unkown')
print (dif)
{'cat_d': 'cat_unkown'}

#rename columns and if-else for possible multiplied renamed columns
df3 = (df1.rename(columns=dif)
        .assign(cat_unkown = lambda x: x.pop('cat_unkown').max(axis=1) 
                             if isinstance(x['cat_unkown'], pd.DataFrame) 
                             else x.pop('cat_unkown'))
        .reindex(columns=orig_cols, fill_value=0)
        )

print (df3)
   cat_a  cat_b  cat_c  cat_unkown
0      1      0      0           0
1      0      1      0           0
2      0      0      0           1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM