Python groupby循环内写入DataFrame后newTimeDF为空问题求解
问题排查与解决方案
核心错误点
- 语法错误:创建
timeZonesDF时缺少方法调用括号,正确写法是pd.DataFrame({"timeZoneDate": [xxx]});同时列表内的日期没有加引号也没有转时间类型,会被识别为减法表达式直接报错。 pd.Grouper未指定分组列:按时间频率分组时必须传入key参数指定要分组的时间列,否则默认会按索引分组,你的索引不是时间序列的情况下,groupby不会返回任何分组,for循环全程不执行,自然不会给newTimeDF写入任何值。- 空DataFrame赋值逻辑错误:你初始化的
newTimeDF没有任何行,直接给整列newTimeDF["startDate"]赋值时,因为没有匹配的行索引,赋值操作不会生效,也不会自动生成新行。 - 赋值逻辑不会追加数据:就算
newTimeDF有行,你每次给整列赋值也只会覆盖原有值,不会追加新的行,最终只会保留最后一次循环的结果。
groupby场景for循环的注意事项
- 执行遍历前先验证分组结果:可以先打印所有分组键
print([group_key for group_key, group_data in df.groupby(...)]),确认分组数量、分组键符合预期,避免循环根本没执行的问题。 - 时间分组的Grouper必须明确分组依据:要么提前把时间列设为索引,要么给
pd.Grouper传入key参数指定时间列,否则分组逻辑不符合预期。 - 不要在循环里反复修改DataFrame结构:循环内追加行的效率极低,推荐先把每次循环的结果存为字典/Series列表,循环结束后一次性转成DataFrame,性能和可读性都更好。
修正后参考代码
import pandas as pd # 正确初始化时间DataFrame timeZonesDF = pd.DataFrame({ "timeZoneDate": [pd.to_datetime("2018-03-11"), pd.to_datetime("2018-11-04")] }) result_list = [] # 给Grouper指定key参数 for yearRow, yearData in timeZonesDF.groupby(pd.Grouper(key="timeZoneDate", freq="A")): DST_start = yearData.iloc[0]["timeZoneDate"] DST_end = yearData.iloc[-1]["timeZoneDate"] # 先把结果存到列表里 result_list.append({ "startDate": DST_start, "endDate": DST_end }) # 一次性生成最终DataFrame newTimeDF = pd.DataFrame(result_list)
内容的提问来源于stack exchange,提问作者Matt S
相关产品推荐
相关产品推荐

