在Pandas中引用/计算数据帧中的前几列

2024-05-13 03:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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)我的任何方法都无法接受。以下是我尝试过的:

^{pr2}$

我试图创建一个新数据帧的最终输出,它将显示第2天的值是否比第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中的所有列。我应该如何引用这个函数的列?在

我应该如何引用这个函数的列?在


Tags: sample方法函数iddataframepandasforrandom
2条回答

由于pandas的当前形式假定时间序列数据在索引中是按时间排列的,而不是在列中,因此至少暂时地将数据帧转置将允许使用许多内置方法,例如shift/diff/pct_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

可能有一种更简单的方法来使用面板来实现这一点,但我还没有任何时间序列方面的经验。这就是我如何使用数据帧完成您想要的:

首先制作一个虚拟的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的第一列来创建一个新的DataFrame

^{pr2}$

ix表示法允许对列进行切片。一开始可能会让人困惑,但它的英文意思是:“从1到结尾只取所有行和列”。在

此时,两个DataFrames具有相同的索引。你不需要创建你自己的“ID”,除非你需要它做其他事情。熊猫会自动为你索引每个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

现在我们已经重命名了列,这样它们就可以按照我们想要的方式对齐。执行除法计算很容易,因为熊猫会完成所有的排列。不需要循环!在

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

相关问题 更多 >