【问题标题】:Subtracting two columns in pandas with lists to create a cummalative column用列表减去 pandas 中的两列以创建累积列
【发布时间】:2017-02-25 22:52:11
【问题描述】:

数据框由集合 x 组成,集合 x 是一个通用集合,子集列包含一些子集。我想选择比率最高的子集,直到我覆盖了整个集合 x。

未发现 = setx - 子集

这就是我的数据框在 pandas 中的样子:

   ratio                  set x        subset        uncovered
2   2.00  [1, 3, 6, 8, 9, 0, 7]  [8, 3, 6, 1]        [0, 9, 7]
0   1.50  [1, 3, 6, 8, 9, 0, 7]     [1, 3, 6]     [0, 8, 9, 7]
1   1.00  [1, 3, 6, 8, 9, 0, 7]        [9, 0]  [8, 1, 3, 6, 7]
3   0.75  [1, 3, 6, 8, 9, 0, 7]     [1, 3, 7]     [0, 8, 6, 9]

我想创建另一列,减去集合 x 并累积未覆盖列,直到我得到一个空列表。

我试过下面的代码

p['tt']=list(p['set x']-p['subset'])

错误信息:

----------------------------------- ---------------------------- TypeError Traceback(最近一次调用 最后的) /Applications/anaconda/lib/python3.5/site-packages/pandas/core/ops.py 在 na_op(x, y) 第581章 --> 582 raise_on_error=True, **eval_kwargs) 583 除了类型错误:

/Applications/anaconda/lib/python3.5/site-packages/pandas/computation/expressions.py 在评估(op,op_str,a,b,raise_on_error,use_numexpr, **eval_kwargs) 208 返回_evaluate(op,op_str,a,b,raise_on_error=raise_on_error --> 209 **eval_kwargs) 210 返回_evaluate_standard(op, op_str, a, b, raise_on_error=raise_on_error)

/Applications/anaconda/lib/python3.5/site-packages/pandas/computation/expressions.py 在 _evaluate_numexpr(op, op_str, a, b, raise_on_error, truediv, 反转,**eval_kwargs) 119 如果结果为无: --> 120 结果 = _evaluate_standard(op, op_str, a, b, raise_on_error) 121

/Applications/anaconda/lib/python3.5/site-packages/pandas/computation/expressions.py 在 _evaluate_standard(op, op_str, a, b, raise_on_error, **eval_kwargs) 61 _store_test_result(假) ---> 62 返回操作(a,b) 63

TypeError: 不支持的操作数类型 -: 'list' 和 'list'

在处理上述异常的过程中,又发生了一个异常:

TypeError Traceback(最近调用 最后)在() ----> 1 p['tt']=list(p['set x']-p['subset'])

/Applications/anaconda/lib/python3.5/site-packages/pandas/core/ops.py 在包装器中(左,右,名称,na_op) 第639章 640 --> 641 arr = na_op(左值,右值) 642 643 return left._constructor(wrap_results(arr), index=index,

/Applications/anaconda/lib/python3.5/site-packages/pandas/core/ops.py 在 na_op(x, y) 586 结果 = np.empty(x.size,dtype=dtype) 第587章 --> 588 结果[掩码] = op(x[掩码], _values_from_object(y[掩码])) 第589章 590 结果 = np.empty(len(x), dtype=x.dtype)

TypeError: 不支持的操作数类型 -: 'list' 和 'list'

【问题讨论】:

  • 您的代码不起作用吗?你在 pandas 中试过吗?
  • 它不工作。是的,我在 pandas 中尝试过
  • 以上是你的pandas代码吗?什么不工作?
  • 请看我编辑的帖子
  • 你本质上是在做列表操作,而不是集合操作。 - 没有为列表定义。我不知道熊猫是否存储集合,但您始终可以将列表转换为集合。这可能有效p['tt']=list(set(p['set x'])-set(p['subset']))

标签: python pandas


【解决方案1】:

这应该适合你:

import pandas as pd

#    ratio                  set x        subset        uncovered
# 2   2.00  [1, 3, 6, 8, 9, 0, 7]  [8, 3, 6, 1]        [0, 9, 7]
# 0   1.50  [1, 3, 6, 8, 9, 0, 7]     [1, 3, 6]     [0, 8, 9, 7]
# 1   1.00  [1, 3, 6, 8, 9, 0, 7]        [9, 0]  [8, 1, 3, 6, 7]
# 3   0.75  [1, 3, 6, 8, 9, 0, 7]     [1, 3, 7]     [0, 8, 6, 9]

p = pd.DataFrame(
    [
        {'set x': [1, 3, 6, 8, 9, 0, 7], 'subset': [1, 3, 6]},
        {'set x': [1, 3, 6, 8, 9, 0, 7], 'subset': [9, 0]},
        {'set x': [1, 3, 6, 8, 9, 0, 7], 'subset': [8, 3, 6, 1]},
        {'set x': [1, 3, 6, 8, 9, 0, 7], 'subset': [1, 3, 7]},
    ])


def set_operation(x):
    return list(set(x['set x']) - set(x['subset']))

p['tt'] = p.apply(set_operation, axis=1)

结果是:

                   set x        subset               tt
0  [1, 3, 6, 8, 9, 0, 7]     [1, 3, 6]     [0, 8, 9, 7]
1  [1, 3, 6, 8, 9, 0, 7]        [9, 0]  [8, 1, 3, 6, 7]
2  [1, 3, 6, 8, 9, 0, 7]  [8, 3, 6, 1]        [0, 9, 7]
3  [1, 3, 6, 8, 9, 0, 7]     [1, 3, 7]     [0, 8, 9, 6]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2017-11-14
    • 2020-03-08
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多