iT邦幫忙

0

新手詢問:PYTHON中,要如何將loop中的結果透過pandas append累積起來

<更新>
抱歉沒說清楚,舉10次的例子來說
因為10次結果都會不一樣,所以想要將結果都存在一起
但好像都會被覆蓋掉><

for i in range(10):
    target = 'ctl00$contentPlaceHolder$dataPager$ctl01$ctl''{:02d}'.format(i)
    view_state = soup.find(id='__VIEWSTATE')['value']
    event_validation = soup.find(id='__EVENTVALIDATION')['value']
    viewstate_generator = soup.find(id='__VIEWSTATEGENERATOR')['value']
    form_data = {
        '__VIEWSTATE': view_state,
        '__VIEWSTATEGENERATOR': viewstate_generator,
        '__EVENTVALIDATION': event_validation,
        '__EVENTTARGET':target,
        'ctl00$contentPlaceHolder$ucCoopVegFruitMarket$radlMarketRange':'A',
        'ctl00$contentPlaceHolder$dropProductClass':'1',
        'ctl00$contentPlaceHolder$hfldTransVolume':s2,
        }
    resp = requests.post('url', data=form_data)
    df = pd.read_html(resp.text)
    df2 = df.append(df)
    print(df2)  

謝謝froce大的回答
#############################################################

大家好,小弟剛接觸python幾天...
有個簡單的資料儲存問題

for i in range(10):
     resp = requests.post('url', data=form_data)
     df = pd.read_html(resp.text)
     df2 = df.append(df)
     print(df2)   

這樣只會存到最後兩次,不曉得是哪邊寫錯了

1 個回答

1
froce
iT邦大師 5 級 ‧ 2018-03-18 16:26:49
最佳解答
for i in range(10):   #每一次做迴圈,都會重作下面程式,等於每次都清空df內容,重新載入,共10次
     resp = requests.post('url', data=form_data)
     df = pd.read_html(resp.text)   #這邊df已經是pandas的dataframe了
     df2 = df.append(df)    #這邊你df2把他指向 df以外,然後又append一次df,等於做兩次
     print(df2)   

所以你會得到2次結果,因為你在迴圈跑10次的最後1次裡,存了2次df。
我不懂你要的結果是什麼,同樣的df你要10個?還是一個df裡,資料重複10次?
寫一個範例看是不是你要的。

resp = requests.post('url', data=form_data)
df = pd.read_html(resp.text)
df2 = pd.DataFrame()

for i in range(10):
    df2.append(df)

print(df2)
看更多先前的回應...收起先前的回應...
truth1999 iT邦新手 5 級 ‧ 2018-03-18 21:50:48 檢舉

抱歉沒說清楚,舉10次的例子來說
因為10次結果都會不一樣,所以想要將結果都存在一起
但好像都會被覆蓋掉><

for i in range(10):
    target = 'ctl00$contentPlaceHolder$dataPager$ctl01$ctl''{:02d}'.format(i)
    view_state = soup.find(id='__VIEWSTATE')['value']
    event_validation = soup.find(id='__EVENTVALIDATION')['value']
    viewstate_generator = soup.find(id='__VIEWSTATEGENERATOR')['value']
    form_data = {
        '__VIEWSTATE': view_state,
        '__VIEWSTATEGENERATOR': viewstate_generator,
        '__EVENTVALIDATION': event_validation,
        '__EVENTTARGET':target,
        'ctl00$contentPlaceHolder$ucCoopVegFruitMarket$radlMarketRange':'A',
        'ctl00$contentPlaceHolder$dropProductClass':'1',
        'ctl00$contentPlaceHolder$hfldTransVolume':s2,
        }
    resp = requests.post('url', data=form_data)
    df = pd.read_html(resp.text)
    df2 = df.append(df)
    print(df2)  
froce iT邦大師 5 級 ‧ 2018-03-18 23:27:19 檢舉

建議先去查查變數的生命週期,你這樣以後還會遇到一堆問題。
要寫程式的話,該懂的基礎還是得懂。
其實我上面的範例已經回答了你的問題了。

df2 = pd.DataFrame()    #df2放在迴圈外,才能在迴圈外存取

for i in range(10):
    target = 'ctl00$contentPlaceHolder$dataPager$ctl01$ctl''{:02d}'.format(i)
    view_state = soup.find(id='__VIEWSTATE')['value']
    event_validation = soup.find(id='__EVENTVALIDATION')['value']
    viewstate_generator = soup.find(id='__VIEWSTATEGENERATOR')['value']
    form_data = {
        '__VIEWSTATE': view_state,
        '__VIEWSTATEGENERATOR': viewstate_generator,
        '__EVENTVALIDATION': event_validation,
        '__EVENTTARGET':target,
        'ctl00$contentPlaceHolder$ucCoopVegFruitMarket$radlMarketRange':'A',
        'ctl00$contentPlaceHolder$dropProductClass':'1',
        'ctl00$contentPlaceHolder$hfldTransVolume':s2,
        }
    resp = requests.post('url', data=form_data)
    df = pd.read_html(resp.text)
    df2.append(df)    #在df2 append df

print(df2)
truth1999 iT邦新手 5 級 ‧ 2018-03-19 00:37:46 檢舉

謝謝您的協助,我會好好的釐清觀念

read_html應該是回傳dataframe的list,可以理解成[df0,df1,...],所以建議你先用索引抓出第一個dataframe(我猜你只要第一個啦)。
上面提了變數的scope問題,我就不說了。

truth1999 iT邦新手 5 級 ‧ 2018-03-19 11:11:54 檢舉

原來如此,受益了,謝謝G大 : )

我要發表回答

立即登入回答