首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带numpy的条件矢量化,如何向数据单元格中添加列表

带numpy的条件矢量化,如何向数据单元格中添加列表
EN

Stack Overflow用户
提问于 2021-08-04 05:10:48
回答 2查看 83关注 0票数 1

我有两个数据格式合并在一起,两个填充的整数列和一个空列表的第三列。

代码语言:javascript
运行
复制
df = pd.DataFrame({'col1': ['z','x','c','v','b','n'], 'col2': [100, 200, 300, 400, 500, 600]})
df1 = pd.DataFrame({'col1': ['z','x','c','v','b','n'], 'col2': [10, 20, 300, 40, 50, 600]})   
df['col3'] = np.empty((len(df), 0)).tolist()
df1['col3'] = np.empty((len(df), 0)).tolist()

df2 = df.merge(df1, on='col1', how='outer')

从而产生这个

代码语言:javascript
运行
复制
     col1  col2_x col3_x  col2_y col3_y
0    z      10     []      63     []
1    x      24     []    1365     []
2    c     642     []     356     []
3    v     462     []       2     []
4    b    2454     []     467     []
5    n      23     []      23     []

我想做一些计算,如果条件是正确的,如果是的话,在df2['col3_y']中的每个列表中添加一个值。

代码语言:javascript
运行
复制
condition = [
    ((df2['col2_y'] != df2['col2_x']) & (len(df2['col3_y']) < 1)),
    ((df2['col2_y'] != df2['col2_x']) & (len(df2['col3_y']) > 0))
]
action = [
    (df2['col2_y'] - df2['col2_x'])/1000,
    df2['col3_y'] + [(df2['col2_y'] - df2['col2_x'] - sum(df2['col3_y']))/1000]
]

df2['col3_y'] = np.select(condition, action)

但是它会抛出一个错误TypeError:不支持的操作数类型(S)表示+:'int‘和'list’。

期望

对于列表列中的每个单元格,同一索引中的if len(list) > 1取其df['col2_y']值减去它的df['col2_x']值除以1,000,并将解决方案附加到列表中,而在同一索引中的elif len(list) > 0取其df['col2_y']值减去df2['col2_x']中的值,减去列表df2['col3_y']之和除以1,000,并将解决方案附加到列表中。如果df2['col2_x'] == df2['col2_y']中的值什么也不做。

代码语言:javascript
运行
复制
  col1  col2_x col3_x  col2_y    col3_y
0    z     100     []      10     [-0.09]
1    x     200     []      20     [-0.18]
2    c     300     []     300     []
3    v     400     []      40     [-0.36]
4    b     500     []      50     [-0.45]
5    n     600     []     600     []
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-04 06:17:13

我完全重写了您的代码,以使用不同的解决方案:

代码语言:javascript
运行
复制
df2['col3_y'] = df2.apply(lambda x: np.append(x['col3_y'],
                                             (x['col2_y']-x['col2_x']-x['col3_y'].sum())/1000)
                                    if x['col2_y']!=x['col2_x']
                                    else x['col3_y'],
                          axis=1)

1次迭代后的输出:

代码语言:javascript
运行
复制
  col1  col2_x col3_x  col2_y    col3_y
0    z      10     []      63   [0.053]
1    x      24     []    1365   [1.341]
2    c     642     []     356  [-0.286]
3    v     462     []       2   [-0.46]
4    b    2454     []     467  [-1.987]
5    n      23     []      23        []

3次迭代后输出:

代码语言:javascript
运行
复制
  col1  col2_x col3_x  col2_y                                           col3_y
0    z      10     []      63          [0.053, 0.052947, 0.052894052999999996]
1    x      24     []    1365  [1.341, 1.3396590000000002, 1.3383193409999998]
2    c     642     []     356        [-0.286, -0.285714, -0.28542828600000003]
3    v     462     []       2                   [-0.46, -0.45954, -0.45908046]
4    b    2454     []     467                [-1.987, -1.985013, -1.983027987]
5    n      23     []      23                                               []
票数 1
EN

Stack Overflow用户

发布于 2021-08-04 05:21:26

罪魁祸首是sum(df2['col3_y'])sum需要一个数字列表,而您有一个列表。

代码语言:javascript
运行
复制
>>> sum([1,2])
3
>>> sum([[],[]])
TypeError: unsupported operand type(s) for +: 'int' and 'list'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68645691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档