熊猫:按字符串的一部分分组

时间:2019-08-23 22:32:35

标签: 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: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日,而在这两个日期之间有一个整月。有办法让它们正确排序吗?

谢谢!

2 个答案:

答案 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')