在 pandas 数据帧中使用 for 循环和 .append 向列表添加值

Add values to a list of list with for loop and .append in pandas dataframe

提问人:toms 提问时间:8/30/2023 更新时间:8/30/2023 访问量:24

问:

我有一个由 3 列组成的数据帧,它们记录了单个位置的坐标和记录位置的时间:

X           Y         MonthYear
2945.13    2588.46    Oct2020
2955.13    2523.36    Oct2020
2945.12    2534.36    Oct2020
....
2935.15    2584.37    Nov2020
2945.12    2523.36    Nov2020
....
2912.17    2548.56    Dec2020
....
2912.17    2548.56    Jan2021
...

我想创建一个列表列表,分别包含每个月的坐标 X Y。

这是我的部分代码:

# I create an empty list of list for each month to fill with coordiantes X Y 
# list of list: one list for each month within the dataframe

points_months = [[] for _ in range(len(pd.unique(XY_22225['MonthYear'])))] 
XY_22225 = XY_22225.reset_index()  # make sure indexes pair with number of rows

现在我想使用 for 循环填充这样的列表:

for index, row in XY_22225.iterrows():
    current_point = (row['X'], row['Y']) # To combine X Y coordinates
    points_months[row['MonthYear']-1].append(current_point) # here I bind each X Y to the corresponding month

但是,出现以下错误消息:IndexError: list index out of range

你可以帮我吗?非常感谢

pandas for 循环 索引 追加

评论

0赞 mozway 8/30/2023
为了清楚起见,您能提供确切的预期输出吗?我假设每个月都有一个列表[(x1, y1), (x2, y2), ...]

答:

1赞 mozway 8/30/2023 #1

您可以使用 groupby 和 conversion to_numpy

out = (df.groupby('MonthYear', sort=False)[['X', 'Y']]
         .apply(lambda g: g.to_numpy().tolist())
      )

输出:

MonthYear
Oct2020    [[2945.13, 2588.46], [2955.13, 2523.36], [2945...
Nov2020             [[2935.15, 2584.37], [2945.12, 2523.36]]
Dec2020                                 [[2912.17, 2548.56]]
Jan2021                                 [[2912.17, 2548.56]]

或者,对于字典:

out = {year_month: g.to_numpy().tolist() for year_month, g in
       df.groupby('MonthYear', sort=False)[['X', 'Y']]}

输出:

{'Oct2020': [[2945.13, 2588.46], [2955.13, 2523.36], [2945.12, 2534.36]],
 'Nov2020': [[2935.15, 2584.37], [2945.12, 2523.36]],
 'Dec2020': [[2912.17, 2548.56]],
 'Jan2021': [[2912.17, 2548.56]]}