我有两个数据格式合并在一起,两个填充的整数列和一个空列表的第三列。
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:不支持的操作数类型(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']
中的值什么也不做。
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 []
发布于 2021-08-04 06:17:13
我完全重写了您的代码,以使用不同的解决方案:
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 []
发布于 2021-08-04 05:21:26
罪魁祸首是sum(df2['col3_y'])
。sum
需要一个数字列表,而您有一个列表。
>>> sum([1,2])
3
>>> sum([[],[]])
TypeError: unsupported operand type(s) for +: 'int' and 'list'
https://stackoverflow.com/questions/68645691
复制相似问题