3

因此,带有 pandas 模块的 Python 似乎是 matlab 和 R 的一个很好的选择。这就是我最近切换到它的原因。那里有资源,我搜索了论坛但找不到类似的东西。如果您有一些教程或其他有用材料的链接,请发布它们。

Wes McKinney 有一个关于熊猫的精彩而详尽的教程。 http://www.youtube.com/watch?v=w26x-z-BdWQ&list=FLJ5xKwlfj7wg8S_A5SgR6Wg&feature=mh_lolz

在 1:10,他展示了如何按日期而不是整数索引数据框中的行的示例。我想做类似的事情。

不同之处在于我有 3 个变量,Y1、Y2、Y3,每个变量都有一列时间戳,X1、X2、X3。

TestFile.txt:  
X1  Y1  X2  Y2  X3  Y3
27/11/2012  11.436  29/11/2012  20.631  4/12/2012   10.209  
28/11/2012  11.468  30/11/2012  20.185  5/12/2012   9.973  
29/11/2012  11.414  3/12/2012   19.962  6/12/2012   9.736  
30/11/2012  11.355  4/12/2012   19.562  7/12/2012   9.509  
3/12/2012   11.309  5/12/2012   18.908  10/12/2012  9.259  
4/12/2012   11.118  6/12/2012   18.288  11/12/2012  8.109  
5/12/2012   10.873  7/12/2012   17.973  
6/12/2012   10.582  10/12/2012  17.788  
7/12/2012   10.264  11/12/2012  17.554  
10/12/2012  9.886  
11/12/2012  9.164  

我想做四件事:

  1. 按 Xi 中的日期关联 Yi 中的数据,因为 i = 1,2,3

  2. 按日期索引行

  3. 删除早于 2012 年 4 月 12 日(即 Y3 的第一个日期)的所有数据

  4. 只能按日期和列访问所有日期

这是一个测试文件,它描述了如何读取数据以及如何打印数据。您可以看到 X1 被正确解析为 pandas 日期格式,但不是 X2 或 X3。这是我试图通过指定 index_col=[0,2,4]

parse_dates = True 来做的

TestFile.py:
import pandas as pd

df = pd.read_csv('TestFile.txt',sep='\t', index_col=[0,2,4], parse_dates = True)

print 'pandas version: ', pd.__version__
print df

给出输出:

pandas version:  0.10.0b1
X1         X2         X3              Y1      Y2      Y3                   
2012-11-27 29/11/2012 4/12/2012   11.436  20.631  10.209
2012-11-28 30/11/2012 5/12/2012   11.468  20.185   9.973
2012-11-29 3/12/2012  6/12/2012   11.414  19.962   9.736
2012-11-30 4/12/2012  7/12/2012   11.355  19.562   9.509
2012-03-12 5/12/2012  10/12/2012  11.309  18.908   9.259
2012-04-12 6/12/2012  11/12/2012  11.118  18.288   8.109
2012-05-12 7/12/2012  None        10.873  17.973     NaN
2012-06-12 10/12/2012 None        10.582  17.788     NaN
2012-07-12 11/12/2012 None        10.264  17.554     NaN
2012-10-12 None       None         9.886     NaN     NaN
2012-11-12 None       None         9.164     NaN     NaN

想要的输出:

                Y1      Y2       Y3                 
2012-04-12  11.118  19.562   10.209
2012-05-12  10.873  18.908    9.973
2012-06-12  10.582  18.288    9.736
2012-07-12  10.264  17.973    9.509
2012-10-12   9.886  17.788    9.259
2012-11-12   9.164  17.554    8.109

如果您对如何执行此操作有任何想法,非常感谢您的帮助:)

4

2 回答 2

3

我认为您的困惑是由于对index_col论点的误解。当您将列列表传递给 时index_col,pandas 正在尝试创建多索引,即具有多个列作为索引的数据框,例如多维表。它不是试图通过连接多个列来创建单个索引。

一种可行的策略是使用输入文件中的适当列对创建三个数据框,然后将它们连接起来。

X1 Y1 X2 Y2 X3 Y3 --> (X1, Y1) 的数据帧 + (X2, Y2) 的数据帧 + (X3, Y3) 的数据帧

如果您正在使用或愿意使用 Pandas 的最新开发版本,可以parse_cols使用read_csv(). 或者您可以读入所有数据,提取您需要的三个数据帧,然后将它们连接起来。

最后,您可以df.truncate使用beforeafter参数来获取您需要的 DateRange。更简单地说,您可以使用dropna()省略缺少值的日期。

希望这可以帮助。请让我们知道您使用的是什么版本的熊猫。

于 2012-12-13T18:08:32.007 回答
2

通过设置index_col=[0,2,4]您正在创建一个 MultiIndex,这就是您获得该输出的原因。

对于您想要的输出, read_csv 将无法即时执行此操作。只需读取单个并合并数据框

于 2012-12-13T18:08:12.457 回答