创建虚拟变量屏蔽的最佳方法是什么?

时间:2018-06-01 19:00:52

标签: python pandas

例如,我有一个包含一列城市名称的pandas DataFrame,我已经有一个大的预定义城市名称列表,将用作模型中的虚拟变量。我希望将列表中的每个城市名称添加为新列,然后填充一堆0和1,其中城市名称列中的字符串与虚拟变量的列名称匹配。

从我的角度来看,我需要做一些事情:

for dv in dummy_var_list:
    df[dv] = df[df[city_names]==dv]

我不确定这是否是一种有效或正确的方法。我需要加入某种“if”陈述或掩盖,我不确定该怎么做。

即。我有城市名称列表:

['paris','sydney','orlando','milwaukee']

我有一个预定义的假人列表,我需要列出:

['tokyo','berlin','beijing','orlando','paris']

所以有些行不会有任何'1',因为没有匹配,但没关系。

2 个答案:

答案 0 :(得分:1)

如果您只对某些城市感兴趣,可以只使用包含您感兴趣的城市的数据框子集,使用pd.dummies获取虚拟列,然后加入原始数据框:

>>> df
  city_names
0      Paris
1   New York
2      Paris
3      Tokyo
4   New York

dummy_var_list = ['Paris', 'New York']

dummy_df = df.join(pd.get_dummies(df.loc[df.city_names.isin(dummy_var_list)], 
                   prefix='', prefix_sep='')).fillna(0)

>>> dummy_df
  city_names  New York  Paris
0      Paris       0.0    1.0
1   New York       1.0    0.0
2      Paris       0.0    1.0
3      Tokyo       0.0    0.0
4   New York       1.0    0.0

修改:如果我理解正确,您需要dummy_var_list中所有城市的虚拟列,即使它们不会显示在city_names中你原来的df。在这种情况下,在上面的代码之后,您可以遍历并为没有显示的城市添加一列零:

>>> df
  city_names
0      Paris
1   New York
2      Paris
3      Tokyo
4   New York

dummy_var_list = ['Paris', 'New York', 'Los Angeles']

dummy_df = df.join(pd.get_dummies(df.loc[df.city_names.isin(dummy_var_list)], 
        prefix='', prefix_sep='')).fillna(0)

for i in dummy_var_list:
    if i not in dummy_df.columns:
        dummy_df[i] = 0 

>>> dummy_df
  city_names  New York  Paris  Los Angeles
0      Paris       0.0    1.0            0
1   New York       1.0    0.0            0
2      Paris       0.0    1.0            0
3      Tokyo       0.0    0.0            0
4   New York       1.0    0.0            0

答案 1 :(得分:0)

你可以这样做:

const ERR_CODES = {
  INVALID_CONSUMER_ID: {
    code: 1000,
    message: 'Invalid Consumer ID',
  },
  INVALID_MOBILE: {
    code: 1001,
    message: 'Invalid Mobile Number',
  },
  INVALID_ZIPCODE: {
    code: 1002,
    message: 'Invalid Zipcode',
  },
  INVALID_FIRST_NAME: {
    code: 1000,
    message: 'First Name',
  }
};

let keys = Object.keys(ERR_CODES);
let codesMap = {};

for (let i = 0; i < keys.length; i++) {
  let key = keys[i];
  let obj = ERR_CODES[key];
  let code = obj.code;

  if (!codesMap[code]) {
    codesMap[code] = true
  } else {
    console.error('Duplicate');
  }
}

初始df:

import numpy as np

df = pd.DataFrame(columns=['tokyo','berlin','beijing','orlando','paris'])
df['city'] = ['paris','sydney','orlando','milwaukee']

输出:

  tokyo berlin beijing orlando paris       city
0   NaN    NaN     NaN     NaN   NaN      paris
1   NaN    NaN     NaN     NaN   NaN     sydney
2   NaN    NaN     NaN     NaN   NaN    orlando
3   NaN    NaN     NaN     NaN   NaN  milwaukee

for col in df.columns:
    df.loc[df['city'] == col, col] = 1
df = df.replace(np.NaN, 0)