【问题标题】:append data frame without a for loop in python在python中附加没有for循环的数据框
【发布时间】:2020-12-29 03:39:22
【问题描述】:

我正在处理大量数据,需要一种更有效的方式来执行以下操作:

rate = [0.03,0.02,0.01]

d = {'portfolio':['abc','de','xyz'], 'A':[0,1,2],'B':[3,4,5]}

df = pd.DataFrame(data=d)

+---+-----------+---+---+
|   | portfolio | A | B |
+---+-----------+---+---+
| 0 | abc       | 0 | 3 |
| 1 | de        | 1 | 4 |
| 2 | xyz       | 2 | 5 |
+---+-----------+---+---+

基本上我有几个费率需要贯穿每个费率方案。我需要将费率添加到最后 2 列

目前这是我拥有的代码:

import pandas as pd

rate = [0.03,0.02,0.01]

scenario_rate = pd.DataFrame()

for i in rate:
    d = {'portfolio':['abc','def','xyz'], 'A':[0,1,2],'B':[3,4,5]}
    df = pd.DataFrame(data=d)
    
    y = df
    y[y.columns[-2:]] += i
    y['rate'] = i
    scenario_rate = scenario_rate.append(y, ignore_index = True)



+---+-----------+------+------+------+
|   | portfolio |  A   |  B   | rate |
+---+-----------+------+------+------+
| 0 | abc       | 0.03 | 3.03 | 0.03 |
| 1 | def       | 1.03 | 4.03 | 0.03 |
| 2 | xyz       | 2.03 | 5.03 | 0.03 |
| 3 | abc       | 0.02 | 3.02 | 0.02 |
| 4 | def       | 1.02 | 4.02 | 0.02 |
| 5 | xyz       | 2.02 | 5.02 | 0.02 |
| 6 | abc       | 0.01 | 3.01 | 0.01 |
| 7 | def       | 1.01 | 4.01 | 0.01 |
| 8 | xyz       | 2.01 | 5.01 | 0.01 |
+---+-----------+------+------+------+


如何更有效地做到这一点?.. 或许没有 for 循环? 谢谢

【问题讨论】:

  • 你从哪里得到的费率?是否在 DF 中?
  • 它只是一个列表 .... rate = [0.03,0.02,0.01]
  • 甚至不要这样做,scenario_rate = scenario_rate.append(y, ignore_index = True) 不要这样做。相反,使用一个列表,然后在最后使用pd.concatenate。虽然,总体上可能有更好的方法

标签: python pandas dataframe loops append


【解决方案1】:

然后分配它explode

df['rate']=[rate]*len(df)
df=df.explode('rate')
df[['A','B']] = df[['A','B']].add(df['rate'],axis=0)

df
Out[62]: 
  portfolio     A     B  rate
0       abc  0.03  3.03  0.03
0       abc  0.02  3.02  0.02
0       abc  0.01  3.01  0.01
1        de  1.03  4.03  0.03
1        de  1.02  4.02  0.02
1        de  1.01  4.01  0.01
2       xyz  2.03  5.03  0.03
2       xyz  2.02  5.02  0.02
2       xyz  2.01  5.01  0.01

【讨论】:

  • 谢谢!这有效并且很快。必须添加 df= df.reset_index(drop = True)
【解决方案2】:

以下应该有效:

def add_rate(somedf, somerate):
    somedf['rate']=0
    new_df=pd.concat([df['portfolio'], df[['A', 'B', 'rate']]+somerate], axis=1)
    return new_df

result=pd.concat([add_rate(df, i) for i in rate], ignore_index=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 2016-12-19
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多