如何遍历熊猫数据框的列以运行回归


187

我敢肯定这很简单,但是作为python的完整新手,我在弄清楚如何遍历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

我认为问题是我不知道如何按键引用return列,所以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 like
EdChum

Answers:


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

1
我似乎只在使用此方法时才获得列标题。因此,例如:print(df)向我显示数据帧列中的数据,但对于df中的c:print(c)仅显示标头,而不显示数据。
user1761806

5
好的,请忽略我-我正在执行print(column)而不是print(df [column])
user1761806

14
注意具有相同名称的列!
freethebees

4
简洁明了。我希望for x in df可以遍历行。:-/
Eric Duminil

7
for idx, row in df.iterrows()遍历行。由于基于col的操作是矢量化的,因此自然而然的是,主要的迭代是在列上进行的:)
Unfun Cat

69

您可以使用iteritems()

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

33

这个答案是要遍历DF中的选定列以及所有列。

df.columns给出包含DF中所有列名称的列表。现在,如果要遍历所有列,则不是很有帮助。但是,当您只想遍历所选列时,它会派上用场。

我们可以根据需要轻松使用Python的列表切片对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 '18

8

一种解决方法是对进行转置DataFrame并在行上进行迭代。

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

4
换位相当昂贵:)
Unfun Cat

可能会很昂贵,但这对于较小的数据帧来说是一个很好的解决方案。谢谢kdauria!
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. 以R平方的降序对结果DF排序,以找出最合适的DF。

这是我在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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.