繁体   English   中英

DataFrame 中特定列的总和值并忽略无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM