如何在python3中将列重复添加到数据框中

时间:2019-11-12 13:50:53

标签: python dataframe

我目前正在编写一个函数来模拟投币游戏中的财富。 f是我将本钱(AUM)投入该游戏的百分比。我模拟10000步,每一步都想将AUM编号包括在我的财富列表中,因此,在10000步的末尾,我将得到一个包含10001个数字的列表(包括AUM = 100)。最后,我希望有一个数据框(10001 * 100),每列对应于投资了不同f(列名)的财富系列。但是我的以下代码不断弹出错误:

提高TypeError(msg) TypeError:无法连接类型为“”的对象;仅有pd.Series,pd.DataFrame和pd.Panel(不建议使用)objs有效

ValueError:值的长度与索引的长度不匹配

谁能帮助我解决这个问题(将100个系列(每个具有10001个元素)添加到一个数据框中)?非常感谢!

df = pd.DataFrame()
wealth = [100] ### initial AUM
def path(f): 
    global AUM
    global wealth
    for j in range(10000):  ### one simulation with 10,000 steps
        if Ber_Dist_V [j] == 1: ### Bernouli distribution
            AUM = AUM * (1-f) + AUM * f * (1 + win)
        else:
            AUM = AUM * (1-f) + AUM * f * (1 + lose)
        wealth.append(AUM)
    wealth = pd.Series(wealth)
    df[f]=wealth

weight = np.linspace(0, 1, 100,endpoint=False).tolist()
for f in weight:
    path_weight(f) 

1 个答案:

答案 0 :(得分:0)

您得到ValueError的原因是您的wealth列表的长度非常不同。没必要将它变成一系列以将其设置为数据框的列之一。您的内部逻辑不是很透明,但是我认为重置列表(因此wealth始终具有恒定的长度)应该可以解决该问题。我建议类似以下内容:

df = pd.DataFrame()
def path(f): 
    global AUM
    wealth = [100] # Resets `wealth` with each invocation of `path()`.
    for j in range(10000):  ### one simulation with 10,000 steps
        if Ber_Dist_V [j] == 1: ### Bernouli distribution
            AUM = AUM * (1-f) + AUM * f * (1 + win)
        else:
            AUM = AUM * (1-f) + AUM * f * (1 + lose)
        wealth.append(AUM)
    df[f] = wealth

weight = np.linspace(0, 1, 100,endpoint=False).tolist()
for f in weight:
    path_weight(f)

但是,如果您想使代码更快(并且您知道wealth的长度为l0001个元素,则可以在实例化时预填充它,而只需更新元素即可。这应该比使用更快.append()。我会这样写:

df = pd.DataFrame()
def path(f): 
    global AUM
    wealth = [100] + [0]*10000 # Resets `wealth` with each invocation of `path()`. Prefills wealth with `0`.
    for j in range(1, 10001):  ### one simulation with 10,000 steps
        if Ber_Dist_V [j] == 1: ### Bernouli distribution
            AUM = AUM * (1-f) + AUM * f * (1 + win)
        else:
            AUM = AUM * (1-f) + AUM * f * (1 + lose)
        wealth[i] = AUM    # Faster than using `.append()`.
    df[f] = wealth

weight = np.linspace(0, 1, 100,endpoint=False).tolist()
for f in weight:
    path_weight(f)