Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用循环将行添加到现有数据帧中_Python_Pandas_Dataframe_Insert - Fatal编程技术网

Python:使用循环将行添加到现有数据帧中

Python:使用循环将行添加到现有数据帧中,python,pandas,dataframe,insert,Python,Pandas,Dataframe,Insert,我正在使用pandas Python库,我希望向现有DF添加行,并保留现有的行 我的数据如下所示: product price max_move_% 1 100 10 for i, row in df_merged.iterrows(): for a in range((row['max_move_%']) * (- 1), row['max_move_%']): df_merged['price_new'] = df_merged['price'] * (1

我正在使用pandas Python库,我希望向现有DF添加行,并保留现有的行

我的数据如下所示:

product price   max_move_%
  1     100      10
for i, row in df_merged.iterrows():
for a in range((row['max_move_%']) * (- 1), row['max_move_%']):
    df_merged['price_new'] = df_merged['price'] * (1 - a / 100.00)
我运行如下循环:

product price   max_move_%
  1     100      10
for i, row in df_merged.iterrows():
for a in range((row['max_move_%']) * (- 1), row['max_move_%']):
    df_merged['price_new'] = df_merged['price'] * (1 - a / 100.00)
我想得到:

product price   max_move_%  true_move     price_new
1       100      10          -10            90
1       100      10          -9             91
 .....
1       100      10          10             110
但是什么也没发生,df看起来和以前一样。 如何向列添加新值,同时保留现有df中的数据

我试过这个:

df_loop = []
for i, row in df_merged.iterrows():
    for a in range((row['max_move_%']) * (- 1), row['max_move_%'] + 1):
    df_loop.append((df_merged['product'], df_merged['price'], f_merged['max_move_%'],a))

pd.DataFrame(df_loop, columns=('product','price','max_move_%','price_new'))
但它不像我想象的那样工作


谢谢大家!

如果我理解正确的话,像这样的事情就行了。使用以下命令在原始数据帧的基础上创建更大的数据帧(但在本例中,行数为原来的21倍):

然后添加新列:

new['true_move'] = [i for i in range(-max_move, max_move + 1)]
new['price_new'] = new['price'] + new['true_move']
这将提供您问题中发布的所需结果


根据较大的数据集的外观,可能需要稍微调整。如果这不符合您的需要,请使用具有代表性的数据集编辑您的问题以进行测试。

我刚刚创建了一个包含所有5个所需列的新数据框,以便在此数据框中添加行:

import pandas as pd

df_merged = pd.DataFrame(data=[[1, 100, 10]], columns=['product', 'price', 'max_move_%'])
print(df_merged)
#    product  price  max_move_%
# 0        1    100          10

new_columns = ['product', 'price', 'max_move_%', 'true_move', 'price_new']
df_new = pd.DataFrame(columns=new_columns)

idx = 0
for i, row in df_merged.iterrows():
    for true_move in range((row['max_move_%']) * (- 1), row['max_move_%']+1):
        price_new = df_merged.iloc[i]['price'] * (1 + true_move / 100.00)
        df_new.loc[idx] = row.values.tolist() + [true_move, price_new]
        idx += 1

print(df_new)
#     product  price  max_move_%  true_move  price_new
# 0       1.0  100.0        10.0      -10.0       90.0
# 1       1.0  100.0        10.0       -9.0       91.0
# 2       1.0  100.0        10.0       -8.0       92.0
# 3       1.0  100.0        10.0       -7.0       93.0
# 4       1.0  100.0        10.0       -6.0       94.0
# 5       1.0  100.0        10.0       -5.0       95.0
# 6       1.0  100.0        10.0       -4.0       96.0
# 7       1.0  100.0        10.0       -3.0       97.0
# 8       1.0  100.0        10.0       -2.0       98.0
# 9       1.0  100.0        10.0       -1.0       99.0
# 10      1.0  100.0        10.0        0.0      100.0
# 11      1.0  100.0        10.0        1.0      101.0
# 12      1.0  100.0        10.0        2.0      102.0
# 13      1.0  100.0        10.0        3.0      103.0
# 14      1.0  100.0        10.0        4.0      104.0
# 15      1.0  100.0        10.0        5.0      105.0
# 16      1.0  100.0        10.0        6.0      106.0
# 17      1.0  100.0        10.0        7.0      107.0
# 18      1.0  100.0        10.0        8.0      108.0
# 19      1.0  100.0        10.0        9.0      109.0
# 20      1.0  100.0        10.0       10.0      110.0

我刚刚修改了您的百分比变化公式,用于评估新的列值。

您能进一步扩展数据示例吗?对于需要扩展为多行的每个产品,您的数据是否只有一行?您好,是的,非常感谢!100*(1-(-10/100.00))不是等于110而不是90吗?你能从数学上解释一下你想在新的价格栏中得到什么吗?嗨,这是%的变化,所以一旦是最小值将是90,最大值110,这看起来不错:)但是。。我在这行中得到一个错误新的['true\u move']=[I为I在范围内(-max\u move,max\u move+1)]我得到值错误:-->9新的['true\u move']=[I为I在范围内(-max\u move,max\u move+1)]这真是太棒了!!!!!多谢各位!请你给我解释一下这件事好吗?“真移动”列中是否填充了此项?df_new.loc[idx]=row.values.tolist()+[a,price_new]是不是真的移动在price_new之前,这就是为什么在那里填充它?df_new.loc[idx]正在将新行分配到
df_new
dataframe中。此数据帧有5列(所需的列),因此任何新行都有这5个值(每列一个)。Line
row.values.tolist()+[a,price\u new]
创建一个大小为5的python列表,其中包含该行的所有值。sum的第一部分(
row.values.tolist()
)将
df\u merged
的当前迭代行中的前3个值添加到新行,而sum的第二部分(
[a,price\u new]
)添加与
true\u move
price\u new
列相对应的最后2个新值。变量
a
只需参考
true\u move
。编辑它。。。