使用 numpy 进行条件矢量化,如何将列表添加到数据框单元格

conditional vectorization with numpy, How to add list to dataframe cells

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

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

产生这个

     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']中的每个列表添加一个值。

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: unsupported operand type(s) for +: 'int' and 'list'.

预期

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

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

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

>>> sum([1,2])
3
>>> sum([[],[]])
TypeError: unsupported operand type(s) for +: 'int' and 'list'

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

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次迭代后的输出:

  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次迭代后的输出:

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