Python 熊猫:按一段线分组

Python 熊猫:按一段线分组,python,pandas,Python,Pandas,我有一个很大的数据集,它有大约6000行和几百列。我已经成功地将大部分信息按需要进行了分类,但现在我陷入了困境,因为我无法按照字符串的一部分进行正确分组 原始数据的格式如下: 6001 17/11/2019 6:00:00 PM 2019 ... 30.519371 NaN 6002 17/11/2019 6:00:00 PM 2019 ... 0.000000 NaN 6003 17/11/2019 6:00:

我有一个很大的数据集,它有大约6000行和几百列。我已经成功地将大部分信息按需要进行了分类,但现在我陷入了困境,因为我无法按照字符串的一部分进行正确分组

原始数据的格式如下:

6001  17/11/2019 6:00:00 PM         2019  ...        30.519371    NaN
6002  17/11/2019 6:00:00 PM         2019  ...         0.000000    NaN
6003  17/11/2019 6:00:00 PM         2019  ...         0.000000    NaN
6004  17/11/2019 6:00:00 PM         2019  ...         0.000000    NaN
6005  17/11/2019 6:00:00 PM         2019  ...         0.000000    NaN

[6006 rows x 153 columns]>
首先,我运行了一个查询,根据其中一列筛选出数据。在这之后,我剩下1500行数据,我需要根据两列对它们进行分组,并将第三列中的数字相加。 此代码似乎主要完成以下任务:

grouped_data = data_drill.groupby(['PeriodStartDate', 'Blast'])
                                  ['Calc_DRILLING_Holes'].sum()
以下是我得到的结果:

In[9]: grouped_data
Out[9]: 
PeriodStartDate        Blast 
1/09/2019 6:00:00 AM   6317.0     70.786625
                       7253.0     60.964185
                       8140.0     41.540451
1/09/2019 6:00:00 PM   6317.0     77.692637
                       7253.0     66.911911
                       8140.0     45.593178
1/10/2019 6:00:00 AM   2040.0     50.791661
                       2379.0     90.084856
                       5271.0     66.029160
1/10/2019 6:00:00 PM   2040.0     42.119914
                       2379.0     98.873622
                       5271.0     72.471029
1/11/2019 6:00:00 AM   2376.0     96.204423
这正是我所需要的,除了这里由于日期的格式,一天的信息分为上午6点和下午6点。我不需要这种分离,我需要整个24小时周期的组合数据

我尝试使用
str.slice
仅获取PeriodStartDate列的前10位数字,但似乎无法正确获取

最后,正如您在上面的输出中所看到的,结果日期是以一种奇怪的方式排序的——9月1日之后是10月1日,而两者之间有整整一个月的日期。有没有办法让它们正确分类


提前谢谢

如果列是datetime类型,最好将时间戳一起删除,只保留日期

df['PeriodStartDate'] = df['PeriodStartDate'].dt.date
然后,您可以按日期进行分组

如果它不是datetime对象(如果切片时遇到问题,那么我怀疑它是),可以通过转换它来实现

pd.to_datetime(df.PeriodStartDate)
之后,对于排序,只需按分组后的日期排序即可

df.groupby(['PeriodStartDate', 'Blast'])['Calc_DRILLING_Holes'].sum().reset_index().sort_values('PeriodStartDate')

您可以使用
str
属性:

grouped_data = data_drill.groupby([data_drill['PeriodStartDate'].str[:9], 'Blast'])
                                  ['Calc_DRILLING_Holes'].sum()
这假设索引将适用于所有日期


或者,将该列转换为
datetime
并使用
data\u drill['PeriodStartDate'].dt.date

谢谢Phillip!这在很大程度上是有效的,尽管我似乎无法得到最后的指示。我一直在犯奇怪的错误<代码>分组数据=数据钻孔.groupby(['PeriodStartDate',Blast'])['Calc_钻孔].sum()).sort('PeriodStartDate')文件“”,第1行分组数据=数据钻孔.groupby(['PeriodStartDate',Blast'])['Calc_钻孔].sum()).sort('PeriodStartDate').sort('PeriodStartDate'))^SyntaxError:无效语法Ahh,好的,抱歉。让我们试试这个
grouped\u data=data\u drill.groupby(['PeriodStartDate','Blast'])['Calc\u DRILLING\u Holes'].sum()).reset\u index().sort\u value('PeriodStartDate')
我没有任何日期时间数据,所以我不能100%肯定地说这会起作用,但我用我自己加载的一些数据进行了测试。如果这仍然给您带来问题,请让我知道,我们可以在这里解决额外的结束括号
sum())
,是否应该在那里?似乎给了我语法错误。如果我删除它,没有错误,但是由于某种原因,
Calc\u DRILLING\u Holes
不能汇总。非常抱歉;这是我在groupby结尾括号中的错误;那应该早一点。你能试试这个密码吗
df.groupby(['PeriodStartDate','Blast'])['Calc_DRILLING_Holes'].sum().reset_index().sort_values('PeriodStartDate')
这将按时间段分组,然后进行爆破,然后对钻孔进行汇总,重置索引,并按时间段对值进行排序;这就是你所期待的流量,对吗?太棒了!结合你和丹的回答,我得到了我想要的!最后,我使用了
grouped\u data=data\u drill.groupby([data\u drill['PeriodStartDate'].str[:10],'Blast'])['Calc\u DRILLING\u Holes'].sum().reset\u index().sort\u值('PeriodStartDate')
来确保我得到所有12个小时的组合。谢谢你的帮助!