【问题标题】:how to compute a new column based on the values of other columns in pandas - python如何根据熊猫中其他列的值计算新列 - python
【发布时间】:2013-08-30 15:00:41
【问题描述】:

假设我的数据框包含这些数据:

>>> df = pd.DataFrame({'a':['l1','l2','l1','l2','l1','l2'],
                       'b':['1','2','2','1','2','2']})
>>> df
    a       b
0  l1       1
1  l2       2
2  l1       2
3  l2       1
4  l1       2
5  l2       2

l1 应该对应于1l2 应该对应于2。 我想创建一个新列“c”,这样对于每一行,c = 1 如果a = l1b = 1(或a = l2b = 2)。如果a = l1b = 2(或a = l2b = 1)那么c = 0

生成的数据框应如下所示:

  a         b   c
0  l1       1   1
1  l2       2   1
2  l1       2   0
3  l2       1   0
4  l1       2   0
5  l2       2   1

我的数据框非常大,所以我真的在寻找使用 pandas 的最有效方法。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)

    【讨论】:

      【解决方案2】:

      你也可以使用字符串方法。

      df['c'] = (df.a.str[-1] == df.b).astype(int)
      

      【讨论】:

        【解决方案3】:

        您可以只使用逻辑运算符。我不确定你为什么使用 1 和 2 的字符串而不是整数,但这里有一个解决方案。最后的 astype 将其从布尔值转换为 0 和 1。

        df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)

        【讨论】:

          【解决方案4】:
          df = pd.DataFrame({'a': numpy.random.choice(['l1', 'l2'], 1000000),
                             'b': numpy.random.choice(['1', '2'], 1000000)})
          

          仅假设两个不同值的快速解决方案:

          %timeit df['c'] = ((df.a == 'l1') == (df.b == '1')).astype(int)
          

          10 个循环,3 个循环中的最佳值:每个循环 178 毫秒

          @Viktor Kerkes:

          %timeit df['c'] = (df.a.str[-1] == df.b).astype(int)
          

          1 次循环,3 次中的最佳:每个循环 412 毫秒

          @user1470788:

          %timeit df['c'] = (((df['a'] == 'l1')&(df['b']=='1'))|((df['a'] == 'l2')&(df['b']=='2'))).astype(int)
          

          1 次循环,3 次取胜:每个循环 363 毫秒

          @herrfz

          %timeit df['c'] = (df.a.apply(lambda x: x[1:])==df.b).astype(int)
          

          1 次循环,3 次取胜:每个循环 387 毫秒

          【讨论】:

          • 有趣,但是您的解决方案明显不那么通用。这里有趣的是 str[1] 方法与简单的 lambda 相比有多糟糕。
          • 你没有测试什么时候(df.a == 'l2') == (df.b == '2')
          • @StevenRumbalski 我假设示例输入是完整的,并且a 的值只有l1l2b 只有'1''2'。如果a != 'l1',则必须是'l2'
          • @user2716201:我不相信 OP 的句子“假设我的数据框包含这些数据”支持该假设。我认为您应该在回答中明确指出该假设。
          • @StevenRumbalski:好点,更新了描述。但是,如果在实际数据中值可能是“狗”和“猫”,我不会感到惊讶,在这种情况下,子字符串解决方案会中断......我还想指出,OP 要求最有效的解决方案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-23
          • 2020-07-12
          • 2021-10-18
          • 2020-09-23
          • 2020-04-09
          • 1970-01-01
          相关资源
          最近更新 更多