วิธีวนซ้ำคอลัมน์ของดาต้าดาต้าแพนด้าเพื่อรันการถดถอย


187

ฉันแน่ใจว่านี้ง่าย แต่เป็นมือใหม่ที่สมบูรณ์เพื่อหลามฉันมีปัญหาในการหาวิธีการวนซ้ำตัวแปรในpandasdataframe และเรียกใช้การถดถอยกับแต่ละ

นี่คือสิ่งที่ฉันทำ:

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()

แต่สมมติว่าฉันต้องการทำเช่นนี้สำหรับแต่ละคอลัมน์ใน dataframe โดยเฉพาะอย่างยิ่งฉันต้องการถอยหลัง FIUIX บน FSTMX แล้วตามด้วย FSAIX บน FSTMX แล้วตามด้วย FSAVX บน FSTMX หลังจากการถดถอยแต่ละครั้งฉันต้องการจัดเก็บสิ่งตกค้าง

ฉันลองรุ่นต่อไปนี้หลายรุ่น แต่ฉันต้องทำให้ไวยากรณ์ผิด:

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 คล้ายกัน
EdChum

คำตอบ:


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

1
ฉันดูเหมือนจะกลับหัวคอลัมน์เมื่อฉันใช้วิธีนี้ ตัวอย่างเช่น: print (df) แสดงข้อมูลในคอลัมน์ dataframe แต่สำหรับ c ใน df: print (c) พิมพ์เฉพาะส่วนหัวที่ไม่ใช่ข้อมูล
user1761806

5
ตกลงไม่สนใจฉัน - ฉันกำลังพิมพ์ (คอลัมน์) ไม่พิมพ์ (df [คอลัมน์])
user1761806

14
ระวังคอลัมน์ที่มีชื่อเดียวกัน!
Freethebees

4
มันดีและรัดกุม ฉันคาดว่าfor x in dfจะย้ำมากกว่าแถว : - /
Eric Duminil

7
for idx, row in df.iterrows()วนซ้ำแถว เนื่องจากการดำเนินงาน colbased จะ vectorized มันเป็นธรรมชาติที่ย้ำหลักคือมากกว่าคอลัมน์ :)
Unfun แมว

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

คุณสามารถคอลัมน์ดัชนี dataframe 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
การขนย้ายมีราคาค่อนข้างแพง :)
แมว Unfun

อาจมีราคาแพง แต่นี่เป็นทางออกที่ดีสำหรับดาต้าเบสขนาดเล็ก ขอบคุณ kdauria!
elPastor

5

การใช้ความเข้าใจในรายการคุณสามารถรับชื่อคอลัมน์ทั้งหมด (ส่วนหัว):

[column for column in df]


2
เวอร์ชั่นสั้น: list(df.columns)หรือ[c for c in df]
The 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 squared ไปยังผล dataframe พร้อมกับรายการคอลัมน์ที่ยกเว้น
  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.