#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. Вам нужно обрезать правую сторону, равную строкам в вашем фрейме данных с левой стороны.