Python: добавление строк в существующий фрейм данных с помощью цикла - PullRequest
0 голосов
/ 05 мая 2018

Я использую библиотеку 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_%  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'))

Но это не работает так, как я предполагал.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Я только что создал новый DataFrame со всеми 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

Я только что изменил ваше уравнение% изменения для оценки price_new значений столбца.

0 голосов
/ 05 мая 2018

Если я правильно понимаю, что-то подобное будет работать. Используйте следующее, чтобы создать больший DataFrame на основе вашего исходного (но с 21-кратным числом строк, в этом примере):

max_move = df_merged['max_move_%'][0]  # 10 in this case
num_rows_needed = max_move * 2 + 1  # 21 in this case
new = pd.concat([df_merged] * num_rows_needed).reset_index(drop=True)

Затем добавьте новые столбцы:

new['true_move'] = [i for i in range(-max_move, max_move + 1)]
new['price_new'] = new['price'] + new['true_move']

Это дает желаемые результаты, как указано в вашем вопросе.

В зависимости от того, как выглядит ваш больший набор данных, возможно, его придется немного подправить. Если это не работает для вас, отредактируйте ваш вопрос с помощью репрезентативного набора данных для тестирования.

...