Python pandas groupby方法无法正常工作

时间:2014-03-19 16:51:32

标签: python group-by pandas time-series

我有一个文本文件,每行包含数据,每行都有一个时间戳。 所以我将数据读取到这样的数据框:

table = pd.read_table(file, sep='|', skiprows=[1], usecols = columns, parse_dates = dateColumns, date_parser = parsedate, converters=columnsFormat)

到目前为止,非常好。

我的结果是一个数据框,如下例所示:

Name Local  Code Date        Value
A1   Here   01   01-01-1990  1.2
A1   Here   01   01-02-1990  0.8
A1   Here   01   01-03-1990  1.6
...
A2   There  02   01-01-1990  1.1
A2   There  02   01-02-1990  0.7
A2   There  02   01-03-1990  1.3
...
An   Where  n    12-31-2013  2.1

日期是按时间顺序排列的,但我有几个小组,但他们没有相同数量的元素。

我想要做的是按NameLocalCode对数据框进行分组。所以我可以将这些值作为索引,将Date和Value作为组的列。

类似下面的示例:

(Index)            Date        Value
(A1   Here   01)   01-01-1990  1.2
                   01-02-1990  0.8
                   01-03-1990  1.6
...
(A2   There  02)   01-01-1990  1.1
                   01-02-1990  0.7
                   01-03-1990  1.3
...
(An   Where  n)    12-31-2013  2.1

但是当我执行

时,而不是像这样的组
table = table.groupby(['Name', 'Local', 'Code'])

我最终在下面有这样的团体。第一组包含第1天的所有数据,第二组包含第2天的所有数据,依此类推。

Name Local  Code Date        Value
A1   Here   01   01-01-1990  1.2
A2   There  02   01-01-1990  1.1
...
A1   Here   01   01-02-1990  0.8
A2   There  02   01-02-1990  0.7
...
A1   Here   01   01-03-1990  1.6
A2   There  02   01-03-1990  1.3
...
An   Where  n    12-31-2013  2.1

关于我如何按照我的解释分组的任何想法?

如果我使用table = table.groupby(['Name', 'Local', 'Code', 'Date']),我有一个组:

Name Local  Code Date        Value
A1   Here   01   01-01-1990  1.2
                 01-02-1990  0.8
                 01-03-1990  1.6
...
A2   There  02   01-01-1990  1.1
                 01-02-1990  0.7
                 01-03-1990  1.3
...
An   Where  n    12-31-2013  2.1

这几乎是我想要的,但我必须在NameLocalCode分成几组。有可能吗?

阅读表格时,parse_datesconverters会改变索引中的内容吗?

希望我现在明白了。 谢谢。

2 个答案:

答案 0 :(得分:1)

作为一种解决方法,您可以set_index然后分组索引:

In [11]: df1 = df.set_index(['Name', 'Local', 'Code'])

In [12]: g = df1.groupby(df1.index)

In [13]: for i in df1.groupby(df1.index): print i
(('A1', 'Here', 1),
                       Date  Value
Name Local Code                   
A1   Here  1     01-01-1990    1.2
           1     01-02-1990    0.8
           1     01-03-1990    1.6)

答案 1 :(得分:0)

回答你的上一个问题:

如果你遍历

groups = df.groupby(['name','local','code'])

您应该为每个组获取单独的数据框,即:

for g, grp in groups:
    print grp