2012-12-26 4 views
0

파이썬과 팬더 (첫 번째와 두 번째 모두)에서 첫 번째 분석을 설정하고이를 올바르게 설정하는 방법에 대해 몇 가지 질문을합니다.팬더의 DataFrame에서 이전 열 참조/계산하기

본질적으로 사용자 행동을 시계열로 살펴보기 위해 노력하고 있지만, 나는 일보다 많은 사용자가 있으므로 매월 보려고합니다. 나는 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) 

나는 둘째 날의 값이 1 일 95 % 이상 작은 지 여부를 표시하는 새로운 dataframe를 만들려고하고있는 무슨의 최종 출력은, 3 일이 95 %인지 : 여기에 내가 시도 것입니다 2 일째 이후 - 앞으로 (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 

을 그러나, 나는이 방법을 잘 모르겠어요 내 함수에서 열을 참조하거나이 함수를 유연하게 만들어 모든 열을 DataFrame에 포함시킬 수는 없습니다. 이 함수의 열을 어떻게 참조해야합니까?

이 기능의 열을 어떻게 참조해야합니까?

답변

1

아마도 패널을 사용하여이 작업을 수행하는 더 쉬운 방법이있을 수 있지만 아직 시계열에 대한 경험이 없습니다. 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 

의 첫 번째 열을 삭제하여 새 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합니다 이것은 내가 사용 DataFrames를 원하는 것을 달성 할 방법입니다 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

는 많은 내장 된 방법의 사용을 가능하게 할 것이다, 현재 양식은 시계열 데이터가 적어도 일시적으로 DataFrame를 전치, 인덱스가 아닌 열 시간 배치되는 가정이다 shift/diff/pct_change/etc.

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 
관련 문제