熊猫如何按间隔按列拆分数据帧

Posted

技术标签:

【中文标题】熊猫如何按间隔按列拆分数据帧【英文标题】:Pandas how to split dataframe by column by interval 【发布时间】:2017-01-29 06:45:02 【问题描述】:

我有一个巨大的数据框,其中包含一个名为dt 的日期时间类型列,该数据框已经根据dt 进行了排序。我想根据dt将数据框拆分成几个数据框,每个数据框包含1 hr范围内的行。

拆分

   dt                    text
0  20160811 11:05        a
1  20160811 11:35        b
2  20160811 12:03        c
3  20160811 12:36        d
4  20160811 12:52        e
5  20160811 14:32        f

进入

   dt                    text
0  20160811 11:05        a
1  20160811 11:35        b
2  20160811 12:03        c

   dt                    text
0  20160811 12:36        d
1  20160811 12:52        e

   dt                    text 
0  20160811 14:32        f

【问题讨论】:

以问题的形式提问 - 而不是“我想要”。 【参考方案1】:

您需要通过dt 列的第一个值的差异将groupby 转换为hour 通过astype

S = pd.to_datetime(df.dt)
for i, g in df.groupby([(S - S[0]).astype('timedelta64[h]')]):
        print (g.reset_index(drop=True))

               dt text
0  20160811 11:05    a
1  20160811 11:35    b
2  20160811 12:03    c
               dt text
0  20160811 12:36    d
1  20160811 12:52    e
               dt text
0  20160811 14:32    f

List comprehension解决方案:

S = pd.to_datetime(df.dt)

print ((S - S[0]).astype('timedelta64[h]'))
0    0.0
1    0.0
2    0.0
3    1.0
4    1.0
5    3.0
Name: dt, dtype: float64

L = [g.reset_index(drop=True) for i, g in df.groupby([(S - S[0]).astype('timedelta64[h]')])]

print (L[0])
               dt text
0  20160811 11:05    a
1  20160811 11:35    b
2  20160811 12:03    c

print (L[1])
               dt text
0  20160811 12:36    d
1  20160811 12:52    e

print (L[2])
               dt text
0  20160811 14:32    f

旧解决方案,由hour拆分:

你可以通过dt.hour使用groupby,但首先需要转换dtto_datetime

for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour]):
    print (g.reset_index(drop=True))

               dt text
0  20160811 11:05    a
1  20160811 11:35    b
               dt text
0  20160811 12:03    c
1  20160811 12:36    d
2  20160811 12:52    e
               dt text
0  20160811 14:32    f

List comprehension解决方案:

L = [g.reset_index(drop=True) for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour])]

print (L[0])
               dt text
0  20160811 11:05    a
1  20160811 11:35    b

print (L[1])
               dt text
0  20160811 12:03    c
1  20160811 12:36    d
2  20160811 12:52    e

print (L[2])
               dt text
0  20160811 14:32    f

或使用list comprehension 将列dt 转换为datetime

df.dt = pd.to_datetime(df.dt)
L =[g.reset_index(drop=True) for i, g in df.groupby([df['dt'].dt.hour])]

print (L[1])
                   dt text
0 2016-08-11 12:03:00    c
1 2016-08-11 12:36:00    d
2 2016-08-11 12:52:00    e

print (L[2])
                   dt text
0 2016-08-11 14:32:00    f

如果需要按dates 和hours 拆分:

#changed dataframe for testing
print (df)
               dt text
0  20160811 11:05    a
1  20160812 11:35    b
2  20160813 12:03    c
3  20160811 12:36    d
4  20160811 12:52    e
5  20160811 14:32    f

serie = pd.to_datetime(df.dt)
for i, g in df.groupby([serie.dt.date, serie.dt.hour]):
    print (g.reset_index(drop=True))
               dt text
0  20160811 11:05    a
               dt text
0  20160811 12:36    d
1  20160811 12:52    e
               dt text
0  20160811 14:32    f
               dt text
0  20160812 11:35    b
               dt text
0  20160813 12:03    c    

【讨论】:

谢谢,如果我想按 2 小时分组怎么办? 我认为你只需要添加2astype('timedelta64[2h]'))【参考方案2】:

取与第一个日期的日期差并按total_seconds分组

df.groupby((df.dt - df.dt[0]).dt.total_seconds() // 3600,
           as_index=False).apply(pd.DataFrame.reset_index, drop=True)

【讨论】:

以上是关于熊猫如何按间隔按列拆分数据帧的主要内容,如果未能解决你的问题,请参考以下文章

按间隔合并两个熊猫数据帧

熊猫数据框分组和求和,组内,跨行值而不是按列

如何按列绘制数据框的多个字典?蟒蛇熊猫

如何根据字节大小拆分熊猫数据帧

pyspark 按列将数据帧拆分为几个数据帧

Python,熊猫连接多个数据帧