【问题标题】:Best way to create a masking of dummy variables?创建虚拟变量掩码的最佳方法?
【发布时间】:2018-11-11 23:04:50
【问题描述】:

例如,我有一个包含一列城市名称的 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',因为没有匹配,但没关系。

【问题讨论】:

标签: python pandas


【解决方案1】:

你可以这样做:

import numpy as np

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

初始df:

  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)

输出:

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

【讨论】:

  • 有趣的方法,我也试试,谢谢
【解决方案2】:

如果您只对某些城市感兴趣,您可以只获取包含您感兴趣的城市的数据框子集,使用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 中为您的所有城市提供一个虚拟列,即使它们没有出现在您原来的df 中的city_names 中。在这种情况下,在上面的代码之后,您可以循环并为未显示的城市添加一列零:

>>> 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

【讨论】:

  • 是的,我会这样做;但是,为了让我的模型工作,数据框中的变量数量需要匹配,这意味着我不能只使用 get_dummies。
  • 我相信这只会让我留下已经在城市名称列中的列,而不是完整的虚拟变量列表(它会将它们过滤掉)。还是我解释错了?
  • 不完全。我已经有一个单独的(更大的)城市名称列表,我需要使用它来在数据框上创建列。因此,数据框上城市名称列中的某些城市可能没有匹配项(即一行全为零,但没关系)。
  • 我认为会有所不同。假设东京在 dummy_var_list 中,而不是在城市名称列中。它还会为东京添加一个包含全零的列吗?
  • 是的!非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2018-04-06
  • 2020-01-31
相关资源
最近更新 更多