【问题标题】:How can I create a dummy variable in Python with a condition below or above median?如何在 Python 中创建一个条件低于或高于中位数的虚拟变量?
【发布时间】:2016-04-15 01:56:44
【问题描述】:

如何在 Python 中创建二进制虚拟变量,当一个人的工资低于平均工资水平时取值为 0,否则设置为 1?当工资高于或低于时,我不明白如何做到这一点。

我试过了

df['Salary'] = (df['Salary'] > df['Salary'].median()) & (df['Salary'] < df['Salary'].median())

但是没有输出。

在此之前我尝试过:

df['Salary'].median()
df_Salary = pd.get_dummies(df['Salary'].median())
df_new = pd.concat([df, df_Salary], axis=1)
df_new

得到了这个

    Gender  Exp Salary  74000.0

0   Female  15  78200   1
1   Female  12  66400   NaN
2   Female  3   6000    NaN
...

【问题讨论】:

    标签: python pandas dummy-variable


    【解决方案1】:

    您可以将布尔值强制为 int,只需将其乘以 1:

    df["Median_Compare"] = (df["Salary"] >= df["Salary"].median()) * 1
    

    【讨论】:

      【解决方案2】:

      您可以进行矢量化比较并将结果转换为 int:

      >>> df["Median_Compare"] = (df["Salary"] >= df["Salary"].median()).astype(int)
      >>> df
         Gender  Exp  Salary  Median_Compare
      0  Female   15   78200               1
      1  Female   12   66400               0
      2  Female    3    6000               0
      

      这行得通,因为我们有

      >>> df["Salary"].median()
      66400.0
      >>> df["Salary"] >= df["Salary"].median()
      0     True
      1    False
      2    False
      Name: Salary, dtype: bool
      >>> (df["Salary"] >= df["Salary"].median()).astype(int)
      0    1
      1    0
      2    0
      Name: Salary, dtype: int32
      

      要使三元方法起作用(X if (condition) else Y),您需要 apply 它,因为它们不能很好地处理数组,数组没有明确的真值。

      【讨论】:

        【解决方案3】:

        这只是使用基本条件并存储变量。

        median = 30500
        salary = 50000
        median_flag = 1 if salary > median else 0
        print median_flag
        1
        

        【讨论】:

          【解决方案4】:

          我认为你想要这样的东西(使用你的符号和变量名)。

          df['Salary'] = 0 if df['Salary'] < df['Salary'].median() else 1
          

          这和它读起来的完全一样。它说如果工资低于中位数,df['Salary'] 将为零,否则为一。作为参考,这种类型的语句称为三元运算符

          【讨论】:

          • 非常感谢!但是当我按照你所说的那样尝试时,发生了一个错误'ValueError:一个系列的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。'
          • 那么这就是df['Salary']df['Salary'].median() 的问题。在不知道这些是什么的情况下,我无法为您提供更具体的帮助,但似乎 df['Salary'] 是一个值数组,python 不知道如何评估 Trues 和 Falses 数组的有效性。您可能需要在df['Salary'] = [0 if salary &lt; df['Salary'].median() else 1 for salary in df['Salary']] 处执行类似列表理解的操作。我只是猜测代码,因为就像我说的,我不知道你的变量是什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          • 2019-03-18
          相关资源
          最近更新 更多