我最近开始用pandas工作,我的问题是这样的。我有两个循环,每个循环产生10个值。我想做的是在我的数据框的底部插入生成的值,其方式是两个循环的索引都是一样的。

这里有一个模拟的例子,与我想做的事情很接近。

import pandas as pd
import random
randint = {'rand': [10,52,99,8],'rand2': [541,632,789,251], 'rand3': [1,3,4,1]}
df = pd.DataFrame(randint, columns = ['rand','rand2', "rand3"])
i = j = len(df)
for x in range(10):
    rand = random.randint(1,101)
    rand2 = random.randint(1,1001)
    df.loc[df.index[i], "rand"] = rand
    df.loc[df.index[i], "rand2"] = rand2
    i = i + 1
for y in range(10):
    rand3 = random.randint(1,11)
    df.loc[df.index[j], "rand3"] = rand3
    j = j + 1
print(df)  

因此,我希望在第5行有第一组rand、rand2、rand3,以此类推(例如:对于x和y=1,我将在同一行有三个值,对于x和y=2,同样的事情,等等)。问题是,我读到过,用pandas迭代不是一个好主意(显然,pandas给我带来了错误"索引4对于尺寸为4的轴0来说超出了范围"),但我真的很难理解pandas的语法,我有点不知道该如何解决这个问题。谢谢你的帮助。

Expected output:

起初,我的数据框架看起来像这样。

问题是,我不知道如何向pandas表明我希望两个循环有相同的索引。如果还不清楚,请告诉我。

4 个评论
你能公布一些预期输出吗?你是否期望row5等于10?+ 【替换代码2+ 1Check this link
例如,如果rand=8,rand2=455,rand3=7,我希望在第5行有:8,455,7。以此类推,下一组rand、rand2和rand3的值。
smci
Use df.concat().你从来不需要用for x in range(len(df)).loc[...]做这种迭代索引。
smci
这回答了你的问题,见concat部分。熊猫合并101
python
pandas
Jauhnax
Jauhnax
发布于 2021-01-03
1 个回答
Danail Petrov
Danail Petrov
发布于 2021-01-03
已采纳
0 人赞同

我不确定情况是否如此,但在你的例子中,第二个循环是在rand2列上工作,而不是rand3。另外,当你使用df.loc时,使用ij的值(而不是df.index[i/j])。

i = j = len(df)
for x in range(10):
    rand = random.randint(1,101)
    rand2 = random.randint(1,1001)
    df.loc[i, "rand"] = rand
    df.loc[i, "rand2"] = rand2
    i = i + 1
for y in range(10):
    rand3 = random.randint(1,11)
    df.loc[j, "rand3"] = rand3
    j = j + 1
print(df)  
    rand  rand2  rand3
0   10.0  541.0    1.0
1   52.0  632.0    3.0
2   99.0  789.0    4.0
3    8.0  251.0    1.0
4   37.0  902.0    6.0
5   65.0  717.0   11.0
6   95.0  345.0    6.0
7   81.0  218.0    9.0
8   90.0  233.0   10.0
9   15.0  918.0    6.0
10  62.0  775.0   10.0
11  27.0  955.0    4.0
12  43.0   17.0    2.0
13  69.0   41.0    8.0

潘达的做法是这样的。

>>> import numpy as np
>>> pd.DataFrame({
    'rand': np.random.randint(1,101,10), 
    'rand2': np.random.randint(1,1001,10), 
    'rand3': np.random.randint(1,11,10)})
   rand  rand2  rand3
0    50    877      5
1     9    929      5
2    23    605      7
3    52    205      4
4    39    341      6
5    17    455      7