遍历 pandas Dataframe 的块

Iterate through chunks of a pandas Dataframe

提问人:Lucas B. Bahadir 提问时间:10/20/2023 最后编辑:Lucas B. Bahadir 更新时间:10/23/2023 访问量:84

问:

我有一只熊猫。DataFrame,如下所示:

星期一 星期二 星期三 星期四 星期五
城市 A 100 300 x z w
城市 B 200 400 y q p
没有 没有 没有 没有 没有 没有
星期一 星期二 星期三 星期四 星期五
城市 A 150 320 一个 c e
城市 B 210 470 z t q
城市 C 260 446 b d f
没有 没有 没有 没有 没有 没有

如此重复,直到一年中的所有星期都被覆盖(它基本上是一个包含数据的每周日历)。

我希望以块的形式循环访问DataFrame,并对这些块中的数据进行一些操作。

如果这有意义的话,这些块基本上应该是“每周”高和“每周到周五”的范围。但是,正如您所看到的,块并不相同,因此我无法将大小硬编码为 4x6。不过,他们总是从“周”到“周”,一直到“星期五”向右走。

有没有直观的方法可以遍历我的 DataFrame?任何帮助都是值得赞赏的。

Python Pandas 数据帧 循环 迭代

评论

0赞 JustLearning 10/20/2023
每周迭代的具体方式将取决于您希望对每个组执行的操作。非常一般地说,您可以按照其中一个答案建议按周分组,但请记住,按行分组通常非常慢,实际上自 pandas 2.1 以来已被弃用。groupby
0赞 Lucas B. Bahadir 10/20/2023
@JustLearning 我的目标是获取每个段,将段保存为临时 DF,在临时 DF 上执行一些操作(如熔化、转置、合并等),最后将临时 DF 附加/连接到一个大 DF 中,该 DF 将包含所有段,然后再进入下一个段

答:

2赞 Learning is a mess 10/20/2023 #1

您可以尝试:

df['week_index'] = df.isna().all(axis='columns').astype(int).cumsum()
for _, df_chunk in df.groupby('week_index'):
    # do something

要每周进行一次:

df['week_index'] = df.isna().all(axis='columns').astype(int).shift(1, fill_value=0).cumsum()
for _, df_chunk in df.groupby('week_index'):
    # process each chunk

评论

0赞 Lucas B. Bahadir 10/20/2023
for 循环中的“_”代表什么?
0赞 Lucas B. Bahadir 10/21/2023
另外,有没有办法让周指数从周到周而不是从无到无?
0赞 Learning is a mess 10/23/2023
@LucasB.Bahadir 检查我的更新,我每周都会提出一种方法
0赞 JustLearning 10/21/2023 #2

使用 CSV 文件复制数据,

# data.csv
Week,Monday,Tuesday,Wednesday,Thursday,Friday
City 100,300,x,z,w
City B,200,400,y,q,p
None,None,None,None,None,None
Week,Monday,Tuesday,Wednesday,Thursday,Friday
City A,150,320,a,c,e
City B,210,470,z,t,q
City C,260,446,b,d,f
None,None,None,None,None,None

您可以执行以下操作以清理原始数据集并将其转换为对组和聚合更有用的内容:

import pandas as pd                                                                                     
                                                                                                        
# Reproduce your data, then drop NaN rows.                                                              
df = pd.read_csv("data.csv", header=None)                                                               
df = df.dropna()                                                                                        
print(df, "\n")                                                                                         
                                                                                                        
# Label rows by week number, and use this label as index.                                               
df['WeekNumber'] = df[df[0] == "Week"].all(axis=1).cumsum().astype('category')                          
df = df.ffill()                                                                                         
df = df.set_index("WeekNumber")                                                                         
print(df, "\n")                                                                                         
                                                                                                        
# Regroup the dataset by week number and reuse header in each group                                     
header = list(df.iloc[0])                                                                               
df = df.groupby("WeekNumber", observed=True,                                                            
                as_index=False).apply(lambda x: x[1:]).reset_index(level=0,                             
                                                                   drop=True)                           
df.columns = header                                                                                     
print(df, "\n")                                                                                         
                                                                                                        
# The name "Week" in the original dataset is somewhat inaccurate, so                                    
# change the corresponding column                                                                       
df = df.rename({"Week": "City"}, axis=1)                                                                
print(df, "\n") 

# Example
print(df.groupby("WeekNumber", observed=True).agg({"Monday": "sum"}))

                Monday
WeekNumber            
1               100200
2            150210260