Получение NAN после добавления одного фрейма данных Pandas к другому

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

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

Мой код:

 prod_prices = np.array([3])
prod_prices

prod_days = np.array([13,9,7,15]).reshape(1,4)
prod_days

df_week_sales = pd.DataFrame(prod_days,
                 index=["Apple"],
                columns=["Mon","Tues","Wed","Thurs"])
df_week_sales

weekly_total = prod_prices.dot(df_week_sales)
weekly_total

weekly_total_sliced = weekly_total[:1]
weekly_total_sliced

df_weekly_total_sliced = pd.DataFrame(weekly_total_sliced)
df_weekly_total_sliced

df_week_sales["Total Rev.($)"] = pd.DataFrame(df_weekly_total_sliced)
df_week_sales
  

Мои ожидания:

          Mon    Tues    Wed    Thurs    Total Rev.($)
Apple    13     9       7      15       37
  

Комментарии:

1. Нет. Это не помогает. Это выдает ошибку: ValueError: Форма передаваемых значений равна (1, 1), индексы подразумевают (5, 1)

2. Просто замените соответствующую строку на: df_week_sales[«Total Rev.($)»] = weekly_total_sliced

3. Да, я тоже пробовал это сначала. Но это тоже не помогает мне и дает NaN в последнем столбце, т. Е. Общий оборот ($)

Ответ №1:

Изменить:

 df_week_sales["Total Rev.($)"] = pd.DataFrame(df_weekly_total_sliced)
  

Для:

 df_week_sales["Total Rev.($)"] = float(df_weekly_total_sliced[0]) # or int(df_weekly_total_sliced[0])
  

Или:

 df_week_sales["Total Rev.($)"] = pd.DataFrame(df_weekly_total_sliced).values.astype(float)
  

Вывод:

         Mon Tues Wed  Thurs Total Rev.($)
Apple   13  9     7   15       39.0
  

Комментарии:

1. Как float заставил это работать? Я имею в виду, в чем здесь концепция?

2. df_weekly_total_sliced[0] Тип @WebDevelopmentLabs — это pandas.series.series , float(df_weekly_total_sliced[0]) приведение его типа к float

Ответ №2:

Вы боретесь с концепцией, что pandas выполняет внутреннее выравнивание данных. Это означает, что если вы выполняете операцию над двумя фреймами данных, pandas будет выравнивать операции на основе индексов строк и заголовков столбцов. Решение вашей проблемы заключается в том, чтобы удалить индексацию из одного из ваших фреймов данных, создающих массив numpy, и установить значение в первом фрейме данных, используя этот массив numpy.

 df_week_sales["Total Rev.($)"] = df_weekly_total_sliced.to_numpy()
df_week_sales
  

Вывод:

        Mon  Tues  Wed  Thurs  Total Rev.($)
Apple   13     9    7     15             39
  

Вам действительно вообще не нужен средний шаг.

 df_week_sales["Total Rev.($)"] = weekly_total[:1]
  

Также будет работать.

Комментарии:

1. он выдает ошибку без этого среднего шага: ValueError: Длина значений (4) не соответствует длине индекса (3)

2. Вам нужно обрезать правую сторону, равную строкам в вашем фрейме данных с левой стороны.