Множество циклов for для создания фрейма данных pandas - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь создать фрейм данных pandas, который выглядит следующим образом:

          -5      0      5
index                     
-5       NaN  slope  slope
 0     slope    NaN  slope
 5     slope  slope    NaN

, но самый близкий я могу получить код ниже, который возвращает фрейм данных только с одним столбцом (который является списком изпоследняя итерация цикла ctr1)

weather = np.linspace(-5, 5, 3)

for ctr1 in weather:
    slope_list = []
    X1 = round(ctr1,1)
    for ctr2 in weather:
        X2 = round(ctr2,1)

        Y1 = regressor[0] * X1**3 + \
        regressor[1] * X1**2 + \
        regressor[2] * X1 + \
        regressor[3] 

        Y2 = regressor[0] * X2**3 + \
        regressor[1] * X2**2 + \
        regressor[2] * X2 + \
        regressor[3]

        slope = (Y2-Y1)/(X2-X1)
        slope_list.append(slope)

    df_final = pd.DataFrame({X1:slope_list})

Кто-нибудь может помочь?

Ответы [ 4 ]

0 голосов
/ 14 октября 2018

Как уже упоминалось, для полноты я разместил ответ на мой вопрос, который работает с большим массивом погоды.Единственное отличие состоит в том, что я делал округление ранее в коде:

weather = np.round(np.linspace(-5, 35, 401), decimals = 1)
df_final = pd.DataFrame([], index=weather)
for ctr1 in weather:
    X1 = ctr1
    for ctr2 in weather:
        X2 = ctr2

        Y1 = regressor[0] * X1**3 + \
        regressor[1] * X1**2 + \
        regressor[2] * X1 + \
        regressor[3] 

        Y2 = regressor[0] * X2**3 + \
        regressor[1] * X2**2 + \
        regressor[2] * X2 + \
        regressor[3]

        slope = (Y2-Y1)/(X2-X1)

        df_final.loc[X1, X2] = np.NaN if X1 == X2 else slope
0 голосов
/ 13 октября 2018

df_final получает только 3 элемента, потому что он находится на том же уровне отступа, что и for ctr2 in weather, поэтому он переназначается для каждого внешнего цикла.Хотя, если вы исправите это, вы получите фрейм данных, представляющий собой только один длинный столбец: к нему добавляется только один slope_list, который в конце превращается в фрейм данных.

Вот как яможет решить эту проблему без изменения вашего метода назначения:

weather = np.linspace(-5, 5, 3)
slope_list = []
for ctr1 in weather:
X1 = round(ctr1,1)
for ctr2 in weather:
    X2 = round(ctr2,1)

    Y1 = regressor[0] * X1**3 + \
    regressor[1] * X1**2 + \
    regressor[2] * X1 + \
    regressor[3] 

    Y2 = regressor[0] * X2**3 + \
    regressor[1] * X2**2 + \
    regressor[2] * X2 + \
    regressor[3]

    slope = (Y2-Y1)/(X2-X1)
    slope_list.append(slope)


#make it 3 columns and 3 rows as intended
slope_list = np.array(slope_list).reshape(3, 3)
#make the dataframe
df_final = pd.DataFrame({X1:slope_list})
#manually add the desired row and column indexes
df_final = df.set_index(weather)
df_final.columns = weather

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

0 голосов
/ 13 октября 2018

Вы можете попробовать напрямую назначить значения в DataFrame.Просто создайте пустой DataFrame с index = weather:

import numpy as np
weather = np.linspace(-5, 5, 3)
df_final = pd.DataFrame([], index=weather)
for ctr1 in weather:
    X1 = round(ctr1,1)
    for ctr2 in weather:
        X2 = round(ctr2,1)

        Y1 = regressor[0] * X1**3 + \
        regressor[1] * X1**2 + \
        regressor[2] * X1 + \
        regressor[3] 

        Y2 = regressor[0] * X2**3 + \
        regressor[1] * X2**2 + \
        regressor[2] * X2 + \
        regressor[3]

       slope = (Y2-Y1)/(X2-X1)

       df_final.loc[X1, X2] = np.NaN if X1 == X2 else slope
0 голосов
/ 13 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...