[英]Sum values in specific columns in DataFrame and ignore None
我想计算我的汽车行驶的距离。 我有汽车需要到 go 的所有坐标。 有些停车场比其他停车场更早,这搞砸了我的计算。 我有这个:
cars= pd.DataFrame({'x': [3,3,3,3,3,3,3,3,3],
'y': [1,2,3,4,5,6,7,8,9],
'x_goal_1': [3,3,3,3,3,3,3,3,3],
'y_goal_1': [10,10,10,10,10,10,10,10,10],
'x_goal_2': [17,24,31,31,17,17,38,38,31],
'y_goal_2': [10,10,10,10,10,10,10,10,10],
'x_goal_3': [17,24,31,31,17,17,38,38,31],
'y_goal_3': [17, 3, 3, 3, 17, 17, 17, 17, 3],
'x_goal_4': [None,27,35,28,14,18,42,43,None],
'y_goal_4': [None, 3, 3, 3, 17, 17, 17, 17, None],
'z': [3,4,5,6,7,8,9,12,22]})
cars['moved_tot'] = (
abs(cars['x']-cars['x_goal_1']) + abs(cars['y']-cars['y_goal_1']) +
abs(cars['x_goal_1']-cars['x_goal_2']) + abs(cars['y_goal_1']-cars['y_goal_2']) +
abs(cars['x_goal_2']-cars['x_goal_3']) + abs(cars['y_goal_2']-cars['y_goal_3']) +
abs(cars['x_goal_3']-cars['x_goal_4']) + abs(cars['y_goal_3']-cars['y_goal_4']) )
然后我得到:
x y x_goal_1 y_goal_1 ... x_goal_4 y_goal_4 z moved_tot
0 3 1 3 10 ... NaN NaN 3 NaN
1 3 2 3 10 ... 27.0 3.0 4 39.0
2 3 3 3 10 ... 35.0 3.0 5 46.0
3 3 4 3 10 ... 28.0 3.0 6 44.0
4 3 5 3 10 ... 14.0 17.0 7 29.0
5 3 6 3 10 ... 18.0 17.0 8 26.0
6 3 7 3 10 ... 42.0 17.0 9 49.0
7 3 8 3 10 ... 43.0 17.0 12 49.0
8 3 9 3 10 ... NaN NaN 22 NaN
我想要第一个moved_tot,我想要30,最后一个我想要36。如果值为None(也就是说,如果这辆车早些时候停过),我希望计算忽略。 我该怎么做呢?
在 David S 的帮助下(谢谢。)我想出了如何去做。
bags['moved_tot'] = (
abs(bags['x']-bags['x_goal_1']).fillna(0) + abs(bags['y']-bags['y_goal_1']).fillna(0) +
abs(bags['x_goal_1']-bags['x_goal_2']).fillna(0) + abs(bags['y_goal_1']-bags['y_goal_2']).fillna(0) +
abs(bags['x_goal_2']-bags['x_goal_3']).fillna(0) + abs(bags['y_goal_2']-bags['y_goal_3']).fillna(0) +
abs(bags['x_goal_3']-bags['x_goal_4']).fillna(0) + abs(bags['y_goal_3']-bags['y_goal_4']).fillna(0)
)
您可以将NaN
替换为0
以避免在结果列中出现NaN
,例如:
cars['moved_tot'] = (abs(cars['x']-cars['x_goal_1'].fillna(0)) + abs(cars['y']-cars['y_goal_1'].fillna(0)) +
abs(cars['x_goal_1'].fillna(0)-cars['x_goal_2'].fillna(0)) + abs(cars['y_goal_1'].fillna(0)-cars['y_goal_2'].fillna(0)) +
abs(cars['x_goal_2'].fillna(0)-cars['x_goal_3'].fillna(0)) + abs(cars['y_goal_2'].fillna(0)-cars['y_goal_3'].fillna(0)) +
abs(cars['x_goal_3'].fillna(0)-cars['x_goal_4'].fillna(0)) + abs(cars['y_goal_3'].fillna(0)-cars['y_goal_4'].fillna(0)) )
如果您想在存在NaN
的情况下将计算结果设为0
,只需将.fillna(0)
移到abs()
之外
只需使用cars = cars.fillna(0)
或cars.fillna(0, inplace=True)
即可摆脱每个abs
之后重复的.fillna(0)
。
如果您不想更改原始 dataframe,请使用cars_ = cars.fillna(0)
然后将cars
cars['moved_tot']
中的 cars 替换为cars_
。
此外,您可以利用列的特性来摆脱重复的列名。
cars_ = cars.fillna(0)
cars_['moved_tot'] = 0
for i in range(len(cars.columns) - 3):
print(cars_.columns[i], '-', cars_.columns[i+2])
cars_['moved_tot'] += abs(cars_[cars_.columns[i]] - cars_[cars_.columns[i+2]])
# Output and print(cars_)
x - x_goal_1
y - y_goal_1
x_goal_1 - x_goal_2
y_goal_1 - y_goal_2
x_goal_2 - x_goal_3
y_goal_2 - y_goal_3
x_goal_3 - x_goal_4
y_goal_3 - y_goal_4
x y x_goal_1 y_goal_1 x_goal_2 y_goal_2 x_goal_3 y_goal_3 x_goal_4 y_goal_4 z moved_tot
0 3 1 3 10 17 10 17 17 0.0 0.0 3 64.0
1 3 2 3 10 24 10 24 3 27.0 3.0 4 39.0
2 3 3 3 10 31 10 31 3 35.0 3.0 5 46.0
3 3 4 3 10 31 10 31 3 28.0 3.0 6 44.0
4 3 5 3 10 17 10 17 17 14.0 17.0 7 29.0
5 3 6 3 10 17 10 17 17 18.0 17.0 8 26.0
6 3 7 3 10 38 10 38 17 42.0 17.0 9 49.0
7 3 8 3 10 38 10 38 17 43.0 17.0 12 49.0
8 3 9 3 10 31 10 31 3 0.0 0.0 22 70.0
你甚至可以在一行中求和
cars_['moved_tot'] = pd.concat([abs(cars_[cars_.columns[i]] - cars_[cars_.columns[i+2]]) for i in range(len(cars.columns) - 3)], axis=1).sum(1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.