Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据框中引用/计算以前的列_Python_Pandas - Fatal编程技术网

Python 在数据框中引用/计算以前的列

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[

我正在用Python和Pandas(这两种语言都是新手)进行我的第一次分析,我有一些关于如何正确设置的问题

从本质上说,我试图在时间序列中查看用户行为,但我的用户数量超过了天,所以我尝试每月查看一次。我以这种方式构建了
数据帧

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