如何在不使用iterrows()的情况下对Pandas中的x行求和?

kdfy810k  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(85)

我有一个数据库,我想创建一个列,其中包含该行和给定列的下3行的总和。我已经设法使用interrows()完成了这个结果,但是,我知道这不是实现这个目标的理想方法。我尝试过以多种方式使用apply()和lambda函数,但我无法使其工作。
下面是我写的代码,它得到了想要的结果:

import pandas as pd
mpg_df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/mpg.csv')

sum_results = []

for index, row in mpg_df.iterrows():
    inital_range = index
    final_range = index+4 if index+4 <= mpg_df.shape[0] else mpg_df.shape[0]

    sum_result = mpg_df['mpg'].iloc[inital_range:final_range].sum()
    sum_results.append(sum_result)

mpg_df["special_sum"] = sum_results
mpg_df

字符串
我的问题是,我怎么能得到相同的结果,有“special_sum”列,而不使用interrows()?
编辑:就我个人而言,我并不反对interrrows(),但是,我正在努力学习Pandas和最佳实践,根据这个答案(How to iterate over rows in a DataFrame in Pandas),我不应该使用interrows(),他们对此非常明确。我不想引起争论,我只想知道是否有更好的方法来完成同样的任务。

xqnpmsa8

xqnpmsa81#

您可以尝试使用.rolling()方法中的自定义索引器:

indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=4)
mpg_df["special_sum_2"] = mpg_df.rolling(indexer, min_periods=1)['mpg'].sum()

# print head and tail of final dataframe
print(mpg_df.head(10))
print()
print(mpg_df.tail(10))

字符串
图纸:

mpg  cylinders  displacement  horsepower  weight  acceleration  model_year origin                       name  special_sum  special_sum_2
0  18.0          8         307.0       130.0    3504          12.0          70    usa  chevrolet chevelle malibu         67.0           67.0
1  15.0          8         350.0       165.0    3693          11.5          70    usa          buick skylark 320         66.0           66.0
2  18.0          8         318.0       150.0    3436          11.0          70    usa         plymouth satellite         66.0           66.0
3  16.0          8         304.0       150.0    3433          12.0          70    usa              amc rebel sst         62.0           62.0
4  17.0          8         302.0       140.0    3449          10.5          70    usa                ford torino         60.0           60.0
5  15.0          8         429.0       198.0    4341          10.0          70    usa           ford galaxie 500         57.0           57.0
6  14.0          8         454.0       220.0    4354           9.0          70    usa           chevrolet impala         57.0           57.0
7  14.0          8         440.0       215.0    4312           8.5          70    usa          plymouth fury iii         58.0           58.0
8  14.0          8         455.0       225.0    4425          10.0          70    usa           pontiac catalina         58.0           58.0
9  15.0          8         390.0       190.0    3850           8.5          70    usa         amc ambassador dpl         59.0           59.0

      mpg  cylinders  displacement  horsepower  weight  acceleration  model_year  origin                        name  special_sum  special_sum_2
388  26.0          4         156.0        92.0    2585          14.5          82     usa  chrysler lebaron medallion        116.0          116.0
389  22.0          6         232.0       112.0    2835          14.7          82     usa              ford granada l        117.0          117.0
390  32.0          4         144.0        96.0    2665          13.9          82   japan            toyota celica gt        122.0          122.0
391  36.0          4         135.0        84.0    2370          13.0          82     usa           dodge charger 2.2        134.0          134.0
392  27.0          4         151.0        90.0    2950          17.3          82     usa            chevrolet camaro        130.0          130.0
393  27.0          4         140.0        86.0    2790          15.6          82     usa             ford mustang gl        131.0          131.0
394  44.0          4          97.0        52.0    2130          24.6          82  europe                   vw pickup        135.0          135.0
395  32.0          4         135.0        84.0    2295          11.6          82     usa               dodge rampage         91.0           91.0
396  28.0          4         120.0        79.0    2625          18.6          82     usa                 ford ranger         59.0           59.0
397  31.0          4         119.0        82.0    2720          19.4          82     usa                  chevy s-10         31.0           31.0

bjp0bcyl

bjp0bcyl2#

也许可以尝试创建一个行列表?

rows = mpg_df.values.tolist()

字符串
然后,对于每一行,计算它自己的值加上接下来的3行的和。

sum_results = []
for i in range(len(rows)):
    # Make j equal to the index of the list that 'mpg' is
    sum_result = rows[i][j] + rows[i+1][j] + rows[i+2][j] + rows[i+3][j]
    sum_results.apppend(sum_result)

相关问题