如何迭代pandas数据帧的列以运行回归

itz*_*tzy 162 python pandas statsmodels

我确信这很简单,但作为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()
Run Code Online (Sandbox Code Playgroud)

我知道我可以运行这样的回归:

regs = sm.OLS(returns.FIUIX,returns.FSTMX).fit()
Run Code Online (Sandbox Code Playgroud)

但是假设我想为数据框中的每一列执行此操作.特别是,我想在FSTMX上退回FIUIX,然后在FSTMX上退回FSAIX,然后在FSTMX上退回FSAVX.在每次回归之后我想存储残差.

我已经尝试了以下各种版本,但我必须得到错误的语法:

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

我认为问题是我不知道如何按键引用返回列,所以returns[k]可能是错误的.

任何关于最佳方法的指导都将非常感激.也许我缺少一种常见的熊猫方法.

The*_*Cat 290

for column in df:
    print(df[column])
Run Code Online (Sandbox Code Playgroud)

  • 注意具有相同名称的列! (13认同)
  • `for idx,row in df.iterrows()`遍历行.由于colbased操作是矢量化的,因此主要迭代是在列上:) (7认同)
  • 好的,请忽略我-我正在执行print(column)而不是print(df [column]) (3认同)
  • 简洁明了。我希望`for x in df`可以遍历行。:-/ (3认同)
  • 当我使用这种方法时,我似乎只取回列标题。例如:print(df) 向我显示数据帧列中的数据,但对于 df 中的 c:print(c) 只打印标题而不是数据。 (2认同)
  • 为什么没有 df.itercols() 来迭代列? (2认同)
  • 谨防; 这只迭代列_names_,而不迭代列。(因此,它回答了OP的详细问题,但不是他们使用的标题!) (2认同)

mdh*_*mdh 59

你可以使用iteritems():

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

  • 很好的答案。顺便说一句,“df.iteritems()”也可以写成“df.items()”,给出相同的结果。 (4认同)
  • 事实上,pandas >= 2.0 只有 `.items()` 而没有 `.iteritems()`。 (3认同)

Abh*_*pta 29

这个答案是迭代选定的列以及DF中的所有列.

df.columns给出一个包含DF中所有列名称的列表.现在,如果要迭代所有列,这不是很有帮助.但是当你想要迭代你选择的列时,它会派上用场.

我们可以根据需要轻松地使用Python的列表切片来切片df.columns.例如,要迭代所有列而不是第一个列,我们可以这样做:

for column in df.columns[1:]:
    print(df[column])
Run Code Online (Sandbox Code Playgroud)

类似于以相反的顺序迭代所有列,我们可以这样做:

for column in df.columns[::-1]:
    print(df[column])
Run Code Online (Sandbox Code Playgroud)

我们可以使用这种技术以很多很酷的方式迭代所有列.还要记住,您可以使用以下方法轻松获取所有列的索引:

for ind, column in enumerate(df.columns):
    print(ind, column)
Run Code Online (Sandbox Code Playgroud)


JAB*_*JAB 21

您可以使用位置索引数据框列ix.

df1.ix[:,1]
Run Code Online (Sandbox Code Playgroud)

例如,返回第一列.(0将是索引)

df1.ix[0,]
Run Code Online (Sandbox Code Playgroud)

这将返回第一行.

df1.ix[:,1]
Run Code Online (Sandbox Code Playgroud)

这将是第0行和第1列交叉处的值:

df1.ix[0,1]
Run Code Online (Sandbox Code Playgroud)

等等.因此,您可以enumerate() returns.keys():使用该数字来索引数据帧.

  • `ix`已被弃用,请使用`iloc` (6认同)

MEh*_*san 8

使用列表理解,您可以获得所有列名称(标题):

[column for column in df]

  • 更短的版本:`list(df.columns)` 或 `[c for c in df]` (3认同)

kda*_*ria 6

解决方法是对DataFrame行进行转置和迭代.

for column_name, column in df.transpose().iterrows():
    print column_name
Run Code Online (Sandbox Code Playgroud)

  • 换位相当昂贵:) (3认同)
  • 可能很昂贵,但对于相对较小的数据帧来说,这是一个很好的解决方案。谢谢 kdauria! (2认同)
  • 我想这个建议已被弃用。对于最新版本的 pandas,最好使用 [DataFrame.items()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.items.html)。此外,如果 DataFrame 由不同的数据类型组成,转置可能会导致数据类型转换。 (2认同)

Her*_*eer 5

根据接受的答案,如果还需要与每列对应的索引

for i, column in enumerate(df):
    print i, df[column]
Run Code Online (Sandbox Code Playgroud)

上面的df[column]类型是Series,可以简单地转换成numpy ndarrays:

for i, column in enumerate(df):
    print i, np.asarray(df[column])
Run Code Online (Sandbox Code Playgroud)