首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for-loop向pandas数据框添加列

使用for-loop向pandas数据框添加列
EN

Stack Overflow用户
提问于 2019-05-03 04:01:16
回答 1查看 32关注 0票数 2

下面的代码块生成了这个表:

代码语言:javascript
复制
       Trial Week   Branch  Num_Dep Tot_dep_amt
       1       1      1       4        4200
       1       1      2       7        9000
       1       1      3       6        4800
       1       1      4       6        5800
       1       1      5       5        3800
       1       1      6       4        3200
       1       1      7       3        1600
       .       .      .       .          .
       .       .      .       .          .
       1       1      8       5        6000
       9       19     40      3        2800

代码:

代码语言:javascript
复制
trials=10
dep_amount=[]
branch=41
total=[]
week=1
week_num=[]
branch_num=[]
dep_num=[]
trial_num=[]
weeks=20

df=pd.DataFrame()

for a in range(1,trials):
    print("Starting trial", a)
    for b in range(1,weeks):
        for c in range(1,branch):
            depnum = int(np.round(np.random.normal(5,2,1)/1)*1)
            acc_dep=0
            for d in range(1,depnum):
                dep_amt=int(np.round(np.random.normal(1200,400,1)/200)*200)
                acc_dep=acc_dep+dep_amt
            temp = pd.DataFrame.from_records([{'Trial': a, 'Week': b, 'branch': c,'Num_Dep': depnum, 'Tot_dep_amt':acc_dep }])
            df = pd.concat([df, temp])
            df = df[['Trial', 'Week', 'branch', 'Num_Dep','Tot_dep_amt']]
            df=df.reset_index()
            df=df.drop('index',axis=1)

我希望能够在for循环中拆分分支,而不是使用头来表示结果df:

代码语言:javascript
复制
Trial   Week   Branch_1_Num_Dep   Branch_1_Tot_dep_amount   Branch_2_Num_ Dep .....etc

我知道这可以通过生成DF并执行编码来完成,但是对于这个任务,如果可能的话,我希望它在for循环中生成。

EN

回答 1

Stack Overflow用户

发布于 2019-05-03 04:54:02

为了在对代码进行最少更改的情况下实现这一点,您可以执行类似以下操作:

代码语言:javascript
复制
df = pd.DataFrame()
for a in range(1, trials):
    print("Starting trial", a)
    for b in range(1, weeks):
        records = {'Trial': a, 'Week': b}
        for c in range(1, branch):
            depnum = int(np.round(np.random.normal(5, 2, 1) / 1) * 1)
            acc_dep = 0
            for d in range(1, depnum):
                dep_amt = int(np.round(np.random.normal(1200, 400, 1) / 200) * 200)
                acc_dep = acc_dep + dep_amt

            records['Branch_{}_Num_Dep'.format(c)] = depnum
            records['Branch_{}_Tot_dep_amount'.format(c)] = acc_dep
        temp = pd.DataFrame.from_records([records])
        df = pd.concat([df, temp])
        df = df.reset_index()
        df = df.drop('index', axis=1)

总体而言,你正在做的事情似乎可以用更优雅和更快的方式完成。我建议将向量化作为一个概念来考虑(例如here)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55959446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档