2012-12-26 178 views
0

我在Python和Pandas中設置了我的第一個分析(兩者都是新手),並且關於如何正確設置它的幾個問題/問題。基本上,我試圖以時間序列來看待用戶行爲,但我有更多的用戶比天,所以我試圖每月看。我已經建立了DataFrame這樣:引用/計算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) 

的什麼,我試圖去建立一個新的數據幀,它會顯示在第2天的值是否大於1天小於95%的最終輸出,無論是3天爲95%少於第2天 - 以後(想象我有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中的所有列中。我應該如何引用這個函數的列?

我應該如何引用這個函數的列?

回答

1

使用面板可能有更簡單的方法來完成此操作,但我對時間序列還沒有任何經驗。這是我怎麼會完成你想要使用DataFrames:通過丟棄的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 

的第一列

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

首先製作一個虛擬DataFrame 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 

現在我們已經改名爲列,以便他們將調整我們想要的方式。由於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 
0

由於它大熊貓目前的形式假定的時間序列數據被安排與時間的索引,不列,調換數據幀,至少暫時,將允許使用的許多內置的方法,如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 
相關問題