【问题标题】:Creating multirow pandas.DataFrames in Loop and append to list在循环中创建多行 pandas.DataFrames 并附加到列表
【发布时间】:2020-09-08 19:52:55
【问题描述】:

我对以下行为感到非常困惑:我有一个循环,它根据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 package于 2020-09-08 创建

让我感到困惑的是:虽然pandas.DataFrames 的结果列表包含预期数量的 DataFrame 行(2 x 5 = 10),但它们只是上一次迭代的 5 个副本。从id 列可以清楚地看到这一点。它应该包含数字 0 到 4,但仅包含数字 4。而在手边,列表 mycontrol 的行为与预期相同,并包含数字 0 到 4。

为什么会这样?我该如何解决这个问题?

【问题讨论】:

    标签: python pandas dataframe loops for-loop


    【解决方案1】:
    • 从下面的输出中可以看出,mydf 会随着每次迭代而更新并添加到 mysimulation
    • 但是,每次迭代都会对mydf 进行就地更新,mysimulation 中的每个mydf 都只是一个指针,而不是副本。
    • 这个问题可以通过添加.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
    

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多