#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Как я могу добиться этого в DoT Product
? Я не могу добавить один Pandas DataFrame
к другому. Мне не нужны длительные решения, а простой код с Pandas
и Numpy
только.
Цены на продукты:
Apple Price = 3
Cherry Price = 4
Blueberry Price = 2
Ожидаемый результат:
Apple Cherry Blueberry
Mon 13 8 6
Tues 9 7 4
Wed 7 4 0
Thurs 15 6 3
Total Rev.($) 83 63 37
Мой код:
prod_prices = np.array([3,4,2])
prod_prices
prod_days = np.array([[13,9,7,15],
[8,7,4,6],
[6,4,0,3]]).T
prod_days
df_week_sales = pd.DataFrame(prod_days,
index=["Mon","Tues","Wed","Thurs"],
columns=["Apple","Cherry","Blueberry"])
df_week_sales
weekly_total = df_week_sales.dot(prod_prices)
weekly_total
type(weekly_total)
weekly_total_nparray = np.array(weekly_total)
type(weekly_total_nparray)
weekly_total_nparray
df_weekly_total_nparray = pd.DataFrame(weekly_total_nparray.reshape(1,4))
df_weekly_total_nparray
weekly_revenue_data = df_week_sales.append(df_weekly_total_nparray)
weekly_revenue_data
И это дает мне следующий результат:
Ответ №1:
Вы можете попробовать что-то вроде этого:
prod_prices = np.array([3,4,2])
prod_days = np.array([[13,9,7,15],
[8,7,4,6],
[6,4,0,3]]).T
df_week_sales = pd.DataFrame(prod_days,
index=["Mon","Tues","Wed","Thurs"],
columns=["Apple","Cherry","Blueberry"])
# obtain the dot product
weekly_total = prod_days.dot(prod_prices)
# obtain the last row index of the data frame
jj = df_week_sales.shape[0]
# get the list to append to the data frame (need to be of the same column length)
df_week_sales.loc[jj] = weekly_total[:-1]
# rename the last index as desired
df_week_sales.rename(index={jj: 'Total Rev.($)'}, inplace=True)
df_week_sales
Комментарии:
1. просто ВАУ. Не могли бы вы объяснить, что именно делает ваш код, начиная с «weekly_total = df_week_sales.dot (prod_prices).to_list ()»
2. 13 9 7 15 = 44 яблока, каждое яблоко стоит 3 доллара, итого 44 * 3 = 132.
3. @lrh09 Цель кода — показать, как добавлять строки к существующему фрейму данных pandas и получать желаемый результат, используя тот же рабочий процесс.
Ответ №2:
prices = {'Apple': 3, 'Cherry': 4, "Blueberry": 2}
df_week_sales = pd.DataFrame(prod_days,
index=["Mon","Tues","Wed","Thurs"],
columns=["Apple","Cherry","Blueberry"])
df_week_sales
Apple Cherry Blueberry
Mon 13 8 6
Tues 9 7 4
Wed 7 4 0
Thurs 15 6 3
Транспонирование:
df = df_week_sales.transpose()
Mon Tues Wed Thurs
Apple 13 9 7 15
Cherry 8 7 4 6
Blueberry 6 4 0 3
df['Total Revenue'] = [np.sum(df_week_sales[x]*prices[x]) for x in df_week_sales.columns]
df
Mon Tues Wed Thurs Total Revenue
Apple 13 9 7 15 132
Cherry 8 7 4 6 100
Blueberry 6 4 0 3 26
results = df.transpose()
Apple Cherry Blueberry
Mon 13 8 6
Tues 9 7 4
Wed 7 4 0
Thurs 15 6 3
Total Revenue 132 100 26
prod_prices = np.array([3,4,2])
results['Revenue'] = df_week_sales.dot(prod_prices)
Apple Cherry Blueberry Revenue
Mon 13 8 6 83.0
Tues 9 7 4 63.0
Wed 7 4 0 37.0
Thurs 15 6 3 75.0
Total Revenue 132 100 26 NaN
Поймите, что ваш ожидаемый результат имеет 83, 63, 37 внизу, но это вообще не имеет смысла. 83 = 13*3 8*4 6*2
, 63 = 9*3 4*2
аналогично для 37
. Тогда где ваш 75
. Данные не предназначены для отображения в этом направлении. Поэтому я буду придерживаться этого способа, который является более значимым для представления данных.
Комментарии:
1. Но результирующие значения здесь неверны. Пожалуйста, перепроверьте раздел «ожидаемый результат».
Ответ №3:
Вы можете достичь этого с помощью двух строк:
total_revenues = [df_week_sales[x].sum() for x in df_week_sales.columns]* prod_prices
output = pd.concat([df_week_sales, pd.DataFrame(total_revenues, index= df_week_sales.columns, columns = ['Total Revenue']).T])
Вывод
| | Apple | Cherry | Blueberry |
|:--------------|--------:|---------:|------------:|
| Mon | 13 | 8 | 6 |
| Tues | 9 | 7 | 4 |
| Wed | 7 | 4 | 0 |
| Thurs | 15 | 6 | 3 |
| Total Revenue | 132 | 100 | 26 |
Комментарии:
1. Но результирующие значения здесь неверны. Пожалуйста, перепроверьте раздел «ожидаемый результат»