引用/计算Pandas中DataFrame中的Previous列

时间:2012-12-26 16:50:47

标签: python pandas

我正在使用Python和Pandas(两者中的新手)设置我的第一个分析,并且有一些关于如何正确设置它的问题/问题。

基本上,我试图查看时间序列中的用户行为,但我的用户数比天数多,所以我试图每月查看一次。我用这种方式构建了DataFrame

df2 = pd.DataFrame({'ID':range(100)})
df2['Day1'] = random.sample(xrange(1000), 100)
df2['Day2'] = random.sample(xrange(1000), 100)
df2['Day3'] = random.sample(xrange(1000), 100)

我尝试过多次向“ID”列添加索引,但1)我不确定是否需要它2)我的方法都没有。这是我尝试过的:

df2 = pd.DataFrame({'ID':range(100)}, index_col='ID')
df2 = pd.DataFrame({'ID':range(100)}, index_col=0)
df2.index(0)
df2.index('ID')
df2.reindex(index='ID')
df2.reindex(index=0)

我想要创建一个新数据框的结果输出,该数据框将显示Day2值是否比第1天低95%,第3天是否比第2天低95%(想象我有一个100列的DataFrame)。我看起来的输出可能如下所示:

ID   Day2   Day3
1    NaN    1
2    NaN    NaN
3    NaN    NaN
4    1      NaN

我认为确定这个的合适方法是运行for循环,如下所示:

for i in df2:
  if (Day2-Day1)/Day1 < .95:
    print 1

但是,我不确定如何在函数中引用列,也不知道如何使此函数灵活地包含DataFrame中的所有列。我该如何引用此功能的列?

我应该如何引用此功能的列?

2 个答案:

答案 0 :(得分:1)

使用面板可能有一种更简单的方法,但我对时间序列没有任何经验。这就是我使用DataFrames完成你想要的东西:

首先制作一个假人DataFrame

In [231]: df2 = DataFrame(np.random.rand(100,3)*100, columns=['Day1','Day2','Day3'])

In [232]: df2.head()
Out[232]:
        Day1       Day2       Day3
0  93.347819  92.866771  91.381466
1   7.819967  26.415094  79.477087
2  98.792627  92.940538  83.774519
3  64.182073  22.563504  15.631763
4  82.460359  89.743872  87.511540

现在,删除DataFrame

的第一列,制作新的df2
In [233]: df3 = df2.ix[:,1:]

In [234]: df3.head()
Out[234]:
        Day2       Day3
0  92.866771  91.381466
1  26.415094  79.477087
2  92.940538  83.774519
3  22.563504  15.631763
4  89.743872  87.511540

ix表示法允许您对列进行切片。它起初可能会让人感到困惑,但它用英文读取:“从1到最后只占用所有行和列。”

此时DataFrames都有相同的索引。您不需要创建自己的“ID”,除非您需要其他内容。 Pandas会自动为每个DataFrames编制索引。这使DataFrames与所有类型的操作对齐。它对列做了同样的事情。它将按列名称排列DataFrames并执行您想要的任何操作。由于您希望除以“下一天”,我们必须更改df3中的列:

In [235]: df3.columns = df2.columns[:-1]

In [236]: df3.head()
Out[236]:
        Day1       Day2
0  92.866771  91.381466
1  26.415094  79.477087
2  92.940538  83.774519
3  22.563504  15.631763
4  89.743872  87.511540

现在我们已重命名列,以便它们按照我们想要的方式对齐。由于Pandas将完成所有对齐,因此执行除法计算很容易。没有必要的循环!

In [244]: df4 = (df2/df3 < .95)

In [245]: df4.head()
Out[245]:
    Day1   Day2   Day3
0  False  False  False
1   True   True  False
2  False  False  False
3  False  False  False
4   True  False  False

答案 1 :(得分:0)

由于pandas的当前形式假设时间序列数据在索引中按时间排列,而不是列,因此至少暂时转置DataFrame将允许使用许多内置方法,例如{{1} } / shift / diff /等

pct_change