提问人:Lucas B. Bahadir 提问时间:10/20/2023 最后编辑:Lucas B. Bahadir 更新时间:10/23/2023 访问量:84
遍历 pandas Dataframe 的块
Iterate through chunks of a pandas Dataframe
问:
我有一只熊猫。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?任何帮助都是值得赞赏的。
答:
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
评论
groupby