Python 在数据框中引用/计算以前的列
我正在用Python和Pandas(这两种语言都是新手)进行我的第一次分析,我有一些关于如何正确设置的问题 从本质上说,我试图在时间序列中查看用户行为,但我的用户数量超过了天,所以我尝试每月查看一次。我以这种方式构建了Python 在数据框中引用/计算以前的列,python,pandas,Python,Pandas,我正在用Python和Pandas(这两种语言都是新手)进行我的第一次分析,我有一些关于如何正确设置的问题 从本质上说,我试图在时间序列中查看用户行为,但我的用户数量超过了天,所以我尝试每月查看一次。我以这种方式构建了数据帧: df2 = pd.DataFrame({'ID':range(100)}) df2['Day1'] = random.sample(xrange(1000), 100) df2['Day2'] = random.sample(xrange(1000), 100) df2[
数据帧
:
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)
我试图创建一个新的数据框的最终输出,它将显示第2天的值是否比第1天小95%,第3天是否比第2天小95%——向前(假设我有一个100列的dataframe
)。我将看到的输出可能如下所示:
ID Day2 Day3
1 NaN 1
2 NaN NaN
3 NaN NaN
4 1 NaN
for i in df2:
if (Day2-Day1)/Day1 < .95:
print 1
我认为确定这一点的适当方法是使用如下内容运行for循环:
ID Day2 Day3
1 NaN 1
2 NaN NaN
3 NaN NaN
4 1 NaN
for i in df2:
if (Day2-Day1)/Day1 < .95:
print 1
df2中i的:
如果(第2天至第1天)/第1天<.95:
打印1
但是,我不确定如何引用函数中的列,也不确定如何使此函数灵活地包含数据帧中的所有列。我应该如何引用此函数的列
我应该如何引用此函数的列 使用面板可能有更简单的方法,但我还没有时间序列方面的经验。这就是我如何使用数据帧实现您想要的:
首先制作一个虚拟的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
现在,通过删除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到结尾,只取所有的行和列”
此时,两个数据帧都具有相同的索引。你不需要创建自己的“ID”,除非你需要它来做其他事情。Pandas将自动为每个数据帧编制索引。这将对齐所有类型操作的数据帧。它对列执行相同的操作。它将按列名排列数据帧
,并执行您想要的任何操作。由于要除以“下一天”,我们必须更改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
现在我们已经重命名了这些列,以便它们按照我们想要的方式对齐。执行分割计算很容易,因为熊猫将完成所有对齐。不需要循环
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
[244]中的:df4=(df2/df3<.95)
In[245]:df4.head()
出[245]:
第1天第2天第3天
0假假假假假
1真假
2假假假假
3假假假假
4真假假假
由于熊猫的当前形式假定时间序列数据在索引中随时间而不是列排列,因此至少暂时转置数据帧将允许使用许多内置方法,例如shift
/diff
/pct\u change
/等
In [78]: df = DataFrame(np.random.rand(100, 3) * 100,
columns=['Day1', 'Day2', 'Day3'])
In [79]: df.head()
Out[79]:
Day1 Day2 Day3
0 27.113276 0.827977 37.059887
1 48.817798 19.335033 12.476411
2 27.001015 18.147742 33.094676
3 38.428321 95.609824 72.395564
4 63.626472 36.207677 1.328216
In [80]: dft = df.T
In [82]: dft.ix[:, :5]
Out[82]:
0 1 2 3 4 5
Day1 27.113276 48.817798 27.001015 38.428321 63.626472 25.900132
Day2 0.827977 19.335033 18.147742 95.609824 36.207677 0.191767
Day3 37.059887 12.476411 33.094676 72.395564 1.328216 37.011027
In [89]: dft.pct_change().ix[:, :5]
Out[89]:
0 1 2 3 4 5
Day1 NaN NaN NaN NaN NaN NaN
Day2 -0.969462 -0.603935 -0.327887 1.488004 -0.430934 -0.992596
Day3 43.759576 -0.354725 0.823625 -0.242802 -0.963317 191.999688
In [94]: chg = (dft.pct_change().dropna() < .95).T.astype(int)
In [95]: chg.head()
Out[95]:
Day2 Day3
0 1 0
1 1 1
2 1 1
3 0 1
4 1 1
[78]中的df=DataFrame(np.random.rand(100,3)*100,
列=['Day1','Day2','Day3'])
In[79]:df.head()
出[79]:
第1天第2天第3天
0 27.113276 0.827977 37.059887
1 48.817798 19.335033 12.476411
2 27.001015 18.147742 33.094676
3 38.428321 95.609824 72.395564
4 63.626472 36.207677 1.328216
In[80]:dft=df.T
In[82]:dft.ix[:,:5]
出[82]:
0 1 2 3 4 5
第1天27.113276 48.817798 27.001015 38.428321 63.626472 25.900132
第2天0.827977 19.335033 18.147742 95.609824 36.207677 0.191767
第3天37.059887 12.476411 33.094676 72.395564 1.328216 37.011027
在[89]中:dft.pct_change().ix[:,:5]
出[89]:
0 1 2 3 4 5
第1天楠楠楠楠楠
第2天-0.969462-0.603935-0.327887 1.488004-0.430934-0.992596
第3天43.759576-0.354725 0.823625-0.242802-0.963317 191.999688
在[94]中:chg=(dft.pct_change().dropna()<.95).T.astype(int)
In[95]:chg.head()
出[95]:
第2天第3天
0 1 0
1 1 1
2 1 1
3 0 1
4 1 1