[英]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.