合并时间序列变量以创建具有任意索引的新DataFrame的问题

时间:2014-06-09 22:21:26

标签: python join merge pandas

所以我试图合并以下列的数据,这些数据当前被索引为每日条目(但每周只有一次点数)。我已经将列分成年份变量但是很难将它们放入合并的数据框中并忽略日期索引,以便我可以按年建立最小/最大列数。我不知道如何获得合并/连接功能。

#Create year variables,追加到具有新索引的新数据框

我有以下内容:

def minmaxdata():
   Totrigs =   dataforgraphs()
   tr = Totrigs
   yrs=[tr['2007'],tr['2008'],tr['2009'],tr['2010'],tr['2011'],tr['2012'],tr['2013'],tr['2014']]
   yrlist = ['tr07','tr08','tr09','tr10','tr11','tr12','tr13','tr14']
   dic = dict(zip(yrlist,yrs))
   yr07,yr08,yr09,yr10,yr11,yr12,yr13,yr14    =dic['tr07'],dic['tr08'],dic['tr09'],dic['tr10'],dic['tr11'],dic['tr12'],dic['tr13'],dic['tr14']


   minmax = yr07.append([yr08,yr09,yr10,yr11,yr12,yr13,yr14],ignore_index=True)

I would like a Dataframe like the following:

   2007  2008 2009 2010 2011 2012 2013 2014  min max 

1   10    13   10    12   34  23   22   14   10  34  
2   25    ...
3   22
4   ...
5
.
.
.  ...
52

1 个答案:

答案 0 :(得分:0)

我不确定您的原始数据是什么样的,但我认为所有年份的硬编码都不是一个好主意。你失去了可重用性。我将设置一个随日整数序列,按日期索引,每周一个日期。

In [65]: idx = pd.date_range ('2007-1-1','2014-12-31',freq='W')

In [66]: df = pd.DataFrame(np.random.randint(100, size=len(idx)), index=idx, columns=['value']) 

In [67]: df.head()
Out[67]: 
            value
2007-01-07      7
2007-01-14      2
2007-01-21     85
2007-01-28     55
2007-02-04     36

In [68]: df.tail()
Out[68]: 
            value
2014-11-30     76
2014-12-07     34
2014-12-14     43
2014-12-21     26
2014-12-28     17

然后获得本周的year

In [69]: df['year'] = df.index.year

In [70]: df['week'] = df.groupby('year').cumcount()+1

(你可以试试df.index.week一周#但我看到了奇怪的行为,比如从1月份的第53周开始)

最后,执行数据透视表以进行转换并获得行max/min

In [71]: df2 = df.pivot_table(index='week', columns='year', values='value')

In [72]: df2['max'] = df2.max(axis=1)

In [73]: df2['min'] = df2.min(axis=1)

现在我们的数据框df2看起来像这样,应该是您需要的:

In [74]: df2
Out[74]: 
year  2007  2008  2009  2010  2011  2012  2013  2014  max  min
week                                                          
1        7    82    13    32    24    58    18    10   82    7
2        2     5    29     0     2    97    59    83   97    0
3       85    89     8    83    63    73    47    49   89    8
4       55     5     1    44    78    10    13    87   87    1
5       36    41    48    98    98    24    24    69   98   24
6       51    43    62    60    44    57    34    33   62   33
7       37    66    72    46    28    11    73    36   73   11
8       30    13    86    93    46    67    95    15   95   13
9       78    84    16    21    70    39    43    90   90   16
10       9     2    88    15    39    81    44    96   96    2
11      34    76    16    44    44    26    30    77   77   16
12       2    24    23    13    25    69    25    74   74    2
13      66    91    67    77    18    47    95    66   95   18
14      59    52    22    42    40    99    88    21   99   21
15      76    17    31    57    43    31    91    67   91   17
16      76    38    53    43    84    45    78     9   84    9
17      88    53    34    22    99    93    61    42   99   22
18      78    19    82    19     5    80    55    69   82    5
19      54    92    56     6     2    85     7    67   92    2
20       8    56    86    41    60    76    31    81   86    8
21      64    76    11    38    41    98    39    72   98   11
22      21    86    34     1    15    27    26    95   95    1
23      82    90     3    17    62    18    93    20   93    3
24      47    42    32    27    83     8    22    14   83    8
25      15    66    70    16     4    22    26    14   70    4
26      12    68    21     7    86     2    27    10   86    2
27      85    85     9    39    17    94    67    42   94    9
28      73    80    96    49    46    23    69    84   96   23
29      57    74     6    71    79    31    79     7   79    6
30      18    84    85    34    71    69     0    62   85    0
31      24    40    93    53    72    46    44    71   93   24
32      95     4    58    57    68    27    95    71   95    4
33      65    84    87    41    38    45    71    33   87   33
34      62    14    41    83    79    63    44    13   83   13
35      49    96    50    62    25    45    69    63   96   25
36       6    38    86    34    98    60    67    80   98    6
37      99    44    26    19    19    20    57    17   99   17
38       2    40     7    65    68    58    68    13   68    2
39      72    31    83    65    69    39    10    76   83   10
40      90    31    42    20     7     8    62    79   90    7
41      10    46    82    96    30    43    12    84   96   10
42      79    38    28    78    25     9    80     2   80    2
43      64    83    63    40    29    86    10    15   86   10
44      89    91    62    48    53    69    16     0   91    0
45      99    26    85    45    26    53    79    86   99   26
46      35    14    46    25    74     6    68    44   74    6
47      17     9    84    88    29    83    85     1   88    1
48      18    69    55    16    77    35    16    76   77   16
49      60     4    36    50    81    28    50    34   81    4
50      36    29    38    28    81    86    71    43   86   28
51      41    82    95    27    95    77    74    26   95   26
52       2    81    89    82    28     2    11    17   89    2
53     NaN   NaN   NaN   NaN   NaN     0   NaN   NaN    0    0

编辑: 如果您需要max/min超过某些列,请列出它们。在这种情况下(2007-2013),它们是连续的,因此您可以执行以下操作。

df2['max_2007to2013'] = df2[range(2007,2014)].max(axis=1)

如果没有,只需将它们列为:df2[[2007,2010,2012,2013]].max(axis=1)