使用 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) > 1
取 df['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 []
我有两个数据框合并在一起,有两列填充的整数和第三列空列表。
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) > 1
取 df['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 []