Я не могу правильно добавить один фрейм данных (Pandas) к другому фрейму данных

#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. Но результирующие значения здесь неверны. Пожалуйста, перепроверьте раздел «ожидаемый результат»