我正在使用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
中的所有列。我该如何引用此功能的列?
我应该如何引用此功能的列?
答案 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