簡體   English   中英

在循環中創建多行 pandas.DataFrames 並附加到列表

[英]Creating multirow pandas.DataFrames in Loop and append to list

我對以下行為感到非常困惑:我有一個循環,它基於pandas.DataFrame創建模擬數據。 每次迭代的輸出是一個帶有新列的新pandas.DataFrame (在下面的示例中為x2 )。

import pandas as pd
import random
mydf = pd.DataFrame({"x":[0]*2})

def addrand(x):
    return(x+random.normalvariate(0,1))

mysimulation = []
mycontrol = []
for i in range(0,5):
    mydf["x2"] = mydf["x"].apply(addrand)
    mydf["i"] = i
    mycontrol.append(i)
    mysimulation.append(mydf)
    
pd.concat(mysimulation)
#>    x        x2  i
0  0  1.023330  4
1  0 -0.428686  4
0  0  1.023330  4
1  0 -0.428686  4
0  0  1.023330  4
1  0 -0.428686  4
0  0  1.023330  4
1  0 -0.428686  4
0  0  1.023330  4
1  0 -0.428686  4

reprexpy 包於 2020 年 9 月 8 日創建

讓我感到困惑的是:雖然生成的pandas.DataFrames列表包含預期的 DataFrames 行數 (2 x 5 = 10),但它們只是上次迭代的 5 個副本。 id列可以清楚地看到這一點。 它應該包含數字 0 到 4,但只包含數字 4。雖然在手上,列表mycontrol行為符合預期並包含數字 0 到 4。

為什么會發生這種情況? 我該如何解決這個問題?

  • 從下面的輸出中可以看出,每次迭代都會更新mydf並添加到mysimulation
  • 然而,在每次迭代,你正在做的就地更新mydf ,每個mydf的內部mysimulation ,只是一個指針,而不是一個副本。
  • 這個問題可以通過添加.copy()來解決,比如mysimulation.append(mydf.copy())
import random
import pandas as pd

random.seed(365)
def addrand(x):
    return(x+random.normalvariate(0,1))


mysimulation = []
mycontrol = []
display(mydf)  # display works in a jupyter notebook, otherwise use print
print('\n')
for i in range(0,5):
    print(i)

    mydf["x2"] = mydf["x"].apply(addrand)
    mydf["i"] = i
    display(mydf)

    mycontrol.append(i)
    mysimulation.append(mydf)
    display(mysimulation)
    print('\n')

在此處輸入圖片說明

有更新

  • mysimulation.append(mydf)mysimulation.append(mydf.copy())
pd.concat(mysimulation)

[out]:
   x       x2  i
0  0  0.63265  0
1  0 -0.85868  0
0  0 -0.43199  1
1  0 -1.49446  1
0  0  0.23422  2
1  0 -0.74176  2
0  0  0.20195  3
1  0  1.61356  3
0  0  0.72138  4
1  0 -0.62529  4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM