我有一个正在处理的大型数据集,它具有约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行数据,我需要根据2列对它们进行分组,并在第三列中求和。 这段代码似乎可以完成大部分工作:
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日,而在这两个日期之间有一个整月。有办法让它们正确排序吗?
谢谢!
答案 0 :(得分:2)
您可以使用str
属性:
grouped_data = data_drill.groupby([data_drill['PeriodStartDate'].str[:9], 'Blast'])
['Calc_DRILLING_Holes'].sum()
这假设您的索引将在所有日期都适用。
或者,将该列转换为datetime
并使用data_drill['PeriodStartDate'].dt.date
答案 1 :(得分:1)
如果该列是日期时间类型,最好将所有时间戳记一起删除并仅保留日期
df['PeriodStartDate'] = df['PeriodStartDate'].dt.date
然后您可以按日期分组。
如果它不是日期时间对象(如果在切片时遇到问题,那么我怀疑是),可以通过转换它来实现
pd.to_datetime(df.PeriodStartDate)
在那之后,为了进行排序,您只需在分组依据之后的日期进行排序
df.groupby(['PeriodStartDate', 'Blast'])['Calc_DRILLING_Holes'].sum().reset_index().sort_values('PeriodStartDate')