प्रतिगमन को चलाने के लिए पांडा डेटाफ्रेम के स्तंभों पर पुनरावृति कैसे करें


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 पर FSAVIX को पुनः प्राप्त करना चाहता हूं। प्रत्येक प्रतिगमन के बाद मैं अवशिष्टों को संग्रहीत करना चाहता हूं।

मैंने निम्नलिखित के विभिन्न संस्करणों की कोशिश की है, लेकिन मुझे वाक्यविन्यास गलत होना चाहिए:

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()ओएस समान
एडचम

जवाबों:


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

1
जब मैं इस पद्धति का उपयोग करता हूं तो मैं केवल कॉलम हेडर वापस पाता हूं। इसलिए उदाहरण के लिए: प्रिंट (डीएफ) मुझे डेटाफ्रेम कॉलम में डेटा दिखाता है लेकिन सी में डीएफ के लिए: प्रिंट (सी) केवल हेडर प्रिंट करता है डेटा नहीं।
user1761806

5
ठीक है मुझे अनदेखा करें - मैं प्रिंट कर रहा था (कॉलम) प्रिंट नहीं (डीएफ [कॉलम])
user1761806

14
समान नाम वाले कॉलम के लिए देखें!
freethebees

4
यह अच्छा और संक्षिप्त है। मैं for x in dfपंक्तियों पर पुनरावृति की उम्मीद करूंगा , हालांकि। : - /
एरिक डुमिनील

7
for idx, row in df.iterrows()पंक्तियों पर प्रसारित। चूंकि कोलबेड ऑपरेशनों को वेक्टर किया जाता है, इसलिए यह स्वाभाविक है कि मुख्य पुनरावृत्ति कॉलम के ऊपर है :)
अनफॉन कैट

69

आप उपयोग कर सकते हैं iteritems():

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

33

यह उत्तर चयनित स्तंभों के साथ-साथ सभी स्तंभों पर एक DF में पुनरावृति करना है ।

df.columnsडीएफ में सभी कॉलमों के नाम वाली एक सूची देता है। यदि आप सभी स्तंभों पर पुनरावृति करना चाहते हैं तो यह बहुत उपयोगी नहीं है। लेकिन यह तब काम आता है जब आप केवल अपने चयन के स्तंभों पर पुनरावृति करना चाहते हैं।

हम अपनी आवश्यकताओं के अनुसार 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
योहन ओबैदिया

8

वर्कअराउंड को ट्रांसपोज़ करना DataFrameऔर पंक्तियों पर पुनरावृति करना है।

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

4
ट्रांसपोज़िशन महंगा है :)
द अनफिन कैट

महंगा हो सकता है, लेकिन यह अपेक्षाकृत छोटे डेटाफ़्रेम के लिए एक महान समाधान है। धन्यवाद कदौरिया!
इलास्टैस्टर

5

सूची समझ का उपयोग करके, आप सभी कॉलम नाम (हेडर) प्राप्त कर सकते हैं:

[column for column in df]


2
छोटा संस्करण: list(df.columns)या[c for c in df]
द अनफिन कैट

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. X संयोजनों को लेने के लिए itertools का उपयोग करें
  3. अपवर्जित स्तंभ सूची के साथ एक परिणाम डेटाफ्रेम के लिए प्रत्येक परिणाम आर चुकता मूल्य जोड़ें
  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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.