팬더 데이터 프레임의 열을 반복하여 회귀를 실행하는 방법


187

나는 이것이 간단하다고 확신하지만 파이썬의 초보자에게는 pandas데이터 프레임 에서 변수를 반복 하고 각각과 회귀를 실행하는 방법을 알아내는 데 어려움을 겪고 있습니다.

내가하고있는 일은 다음과 같습니다.

all_data = {}
for ticker in ['FIUIX', 'FSAIX', 'FSAVX', 'FSTMX']:
    all_data[ticker] = web.get_data_yahoo(ticker, '1/1/2010', '1/1/2015')

prices = DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()})  
returns = prices.pct_change()

다음과 같이 회귀를 실행할 수 있다는 것을 알고 있습니다.

regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()

그러나 데이터 프레임의 각 열에 대해이 작업을 수행하려고한다고 가정하십시오. 특히 FSTMX에서 FIUIX를, FSTMX에서 FSAIX, FSTMX에서 FSAVX를 회귀하고 싶습니다. 각 회귀 후 잔차를 저장하고 싶습니다.

다음의 다양한 버전을 시도했지만 구문이 잘못되어 있어야합니다.

resids = {}
for k in returns.keys():
    reg = sm.OLS(returns[k],returns.FSTMX).fit()
    resids[k] = reg.resid

문제는 키로 리턴 열을 참조하는 방법을 모른다 returns[k]는 것이므로 아마도 잘못된 것입니다.

이를 수행하는 가장 좋은 방법에 대한 지침은 대단히 감사하겠습니다. 아마도 내가 놓친 일반적인 팬더 접근법이있을 것입니다.


1
다음과 같이 열을 첨자화할 수 있습니다 : for i in len(df): if i + 1 != len(df): # sm.OLS(returns[returns.coloumns[i]], returns[returns.columns[ i+1]]), fit()os similar
EdChum

답변:


343
for column in df:
    print(df[column])

1
이 방법을 사용할 때만 열 머리글을 다시 가져 오는 것 같습니다. 예를 들어, print (df)는 데이터 프레임 열의 데이터를 보여 주지만 df의 c : print (c)는 데이터가 아닌 헤더 만 인쇄합니다.
user1761806

5
Ok 나를 무시하십시오-나는 인쇄를하지 않았습니다 (열) 인쇄하지 않음 (df [열])
user1761806

14
같은 이름의 열을 조심하십시오!
freethebees

4
훌륭하고 간결합니다. for x in df그래도 행을 반복 할 것으로 예상 됩니다. :-/
Eric Duminil

7
for idx, row in df.iterrows()행을 반복합니다. colbased 작업이 벡터화되어 있기 때문에 주요 반복이 열에 대한 것이 당연합니다. :
Unfun Cat

69

당신은 사용할 수 있습니다 iteritems():

for name, values in df.iteritems():
    print('{name}: {value}'.format(name=name, value=values[0]))

33

이 답변은 선택한 열과 DF의 모든 열 을 반복 하는 것입니다.

df.columnsDF의 모든 열 이름을 포함하는 목록을 제공합니다. 이제 모든 열을 반복하려는 경우별로 도움이되지 않습니다. 그러나 선택한 열만 반복하려고 할 때 유용합니다.

파이썬의리스트 슬라이싱을 사용하여 필요에 따라 df.columns를 쉽게 슬라이스 할 수 있습니다. 예를 들어 첫 번째 열을 제외한 모든 열을 반복하려면 다음을 수행하십시오.

for column in df.columns[1:]:
    print(df[column])

모든 열을 역순으로 반복하는 것과 마찬가지로 다음과 같이 할 수 있습니다.

for column in df.columns[::-1]:
    print(df[column])

이 기법을 사용하여 모든 열을 여러 가지 멋진 방법으로 반복 할 수 있습니다. 또한 다음을 사용하여 모든 열의 인덱스를 쉽게 얻을 수 있습니다.

for ind, column in enumerate(df.columns):
    print(ind, column)

21

을 사용하여 위치별로 데이터 프레임 열을 색인 할 수 있습니다 ix.

df1.ix[:,1]

예를 들어 첫 번째 열을 반환합니다. (0은 색인 일 것입니다)

df1.ix[0,]

첫 번째 행을 반환합니다.

df1.ix[:,1]

이것은 행 0과 열 1의 교차점에있는 값입니다.

df1.ix[0,1]

등등. 따라서 enumerate() returns.keys():숫자를 사용하여 데이터 프레임을 인덱싱 할 수 있습니다 .


8
ix더 이상 사용되지 않습니다iloc
Yohan Obadia

8

해결 방법은 DataFrame행을 바꾸고 반복하는 것입니다.

for column_name, column in df.transpose().iterrows():
    print column_name

4
조옮김은 다소 비싸다 :)
불행한 고양이

비쌀 수도 있지만 비교적 작은 데이터 프레임에 적합한 솔루션입니다. 고마워요!
elPastor

5

목록 이해를 사용하면 모든 열 이름 (헤더)을 얻을 수 있습니다.

[column for column in df]


2
더 짧은 버전 : list(df.columns)또는[c for c in df]
Unfun Cat

4

허용 된 답변따라 각 열에 해당 하는 색인필요한 경우 :

for i, column in enumerate(df):
    print i, df[column]

위의 df[column]유형은 Series이며 간단히 numpy ndarrays 로 변환 할 수 있습니다 .

for i, column in enumerate(df):
    print i, np.asarray(df[column])

3

조금 늦었지만 여기에 내가 한 일이 있습니다. 단계들:

  1. 모든 열 목록 만들기
  2. itertools를 사용하여 x 조합을 취하십시오
  3. 제외 된 열 목록과 함께 각 결과 R 제곱 값을 결과 데이터 프레임에 추가
  4. 결과 DF를 R 제곱의 내림차순으로 정렬하여 어느 것이 가장 적합한 지 확인하십시오.

이것은 DataFrame에서 사용한 코드 aft_tmt입니다. 사용 사례를 외삽 해주십시오 ..

import pandas as pd
# setting options to print without truncating output
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)

import statsmodels.formula.api as smf
import itertools

# This section gets the column names of the DF and removes some columns which I don't want to use as predictors.
itercols = aft_tmt.columns.tolist()
itercols.remove("sc97")
itercols.remove("sc")
itercols.remove("grc")
itercols.remove("grc97")
print itercols
len(itercols)

# results DF
regression_res = pd.DataFrame(columns = ["Rsq", "predictors", "excluded"])

# excluded cols
exc = []

# change 9 to the number of columns you want to combine from N columns.
#Possibly run an outer loop from 0 to N/2?
for x in itertools.combinations(itercols, 9):
    lmstr = "+".join(x)
    m = smf.ols(formula = "sc ~ " + lmstr, data = aft_tmt)
    f = m.fit()
    exc = [item for item in x if item not in itercols]
    regression_res = regression_res.append(pd.DataFrame([[f.rsquared, lmstr, "+".join([y for y in itercols if y not in list(x)])]], columns = ["Rsq", "predictors", "excluded"]))

regression_res.sort_values(by="Rsq", ascending = False)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.