Heim >Backend-Entwicklung >Python-Tutorial >Berechnen Sie die Summe jeder Zeile des externen Index im Multi-Index-Pandas-Datenrahmen
Ich habe einen Datenrahmen: die günstigste Kombination von seller
、item
、price
、shipping
、免费送货最低
、count available
和count required
。我的目标是根据稍后计算的 total
找到 seller
和 item
(der Berechnungscode wird unten angezeigt). Beispieldaten lauten wie folgt:
import pandas as pd item1 = ['item 1', 'item 2', 'item 1', 'item 1', 'item 2'] seller1 = ['seller 1', 'seller 2', 'seller 3', 'seller 4', 'seller 1'] price1 = [1.85, 1.94, 2.00, 2.00, 2.02] shipping1 = [0.99, 0.99, 0.99, 2.99, 0.99] freeship1 = [5, 5, 5, 50, 5] countavailable1 = [1, 2, 2, 5, 2] countneeded1 = [2, 1, 2, 2, 1] df1 = pd.dataframe({'seller':seller1, 'item':item1, 'price':price1, 'shipping':shipping1, 'free shipping minimum':freeship1, 'count available':countavailable1, 'count needed':countneeded1}) # create columns that states if seller has all counts needed. # this will be used to sort by to prioritize the smallest number of orders possible for index, row in df1.iterrows(): if row['count available'] >= row['count needed']: df1.at[index, 'fulfills count needed'] = 'yes' else: df1.at[index, 'fulfills count needed'] = 'no' # dont want to calc price based on [count available], so need to check if seller has count i need and calc cost based on [count needed]. # if doesn't have [count needed], then calc cost on [count available]. for index, row in df1.iterrows(): if row['count available'] >= row['count needed']: df1.at[index, 'price x count'] = row['count needed'] * row['price'] else: df1.at[index, 'price x count'] = row['count available'] * row['price']
Beide seller
都可以出售多个item
。我想尽量减少支付的运费,所以我想通过 seller
将 item
s 分组在一起。因此,我根据我在另一个线程中看到的方式使用 .first()
-Methoden gruppieren sie jedoch so, dass jede Spalte in einem neuen gruppierten Datenrahmen gehalten wird.
# don't calc [total] until sellers have been grouped # use first() method to return all columns and perform no other aggregations grouped1 = df1.sort_values('price').groupby(['seller', 'item']).first()
An diesem Punkt möchte ich bestehenseller
计算total
。所以我有以下代码,但它为每个 item
计算 total
,而不是 seller
,这意味着 shipping
根据每个组中的商品数量被多次添加,或者当 price x count
结束时不应用免费送货最低免运费
.
# calc [Total] for index, row in grouped1.iterrows(): if (row['Free Shipping Minimum'] == 50) & (row['Price x Count'] > 50): grouped1.at[index, 'Total'] = row['Price x Count'] + 0 elif (row['Free Shipping Minimum'] == 5) & (row['Price x Count'] > 5): grouped1.at[index, 'Total'] = row['Price x Count'] + 0 else: grouped1.at[index, 'Total'] = row['Price x Count'] + row['Shipping']
Es sieht tatsächlich so aus, als müsste ich vielleicht total
时对每个 seller
求和 price x count
berechnen, aber das ist im Wesentlichen das gleiche Problem, da ich nicht weiß, wie ich jede Zeile des äußeren Index berechnen soll. Mit welchen Methoden kann ich das machen?
Wenn jemand Vorschläge hat, wie ich die zweite Hälfte meiner Ziele erreichen kann, kann er mich gerne fragen. Ich möchte einfach jeden Artikel zurückgeben, den ich brauche. Ich benötige zum Beispiel 2 „Projekt 1“ und 2 „Projekt 2“. Wenn „Verkäufer 1“ 2 „Artikel 1“ und 1 „Artikel 2“ hat und „Verkäufer 2“ 1 „Artikel 1“ und 1 „Artikel 2“, dann möchte ich den gesamten Artikel „Verkäufer 1“ (vorausgesetzt, es ist der am günstigsten), aber es gibt nur 1 „Artikel1“ für „Verkäufer2“. Dies scheint sich auf die Berechnung der Spalte total
auszuwirken, ich bin mir jedoch nicht sicher, wie ich es implementieren soll. total
列的计算,但我不确定如何实现它。
我最终决定首先对 seller
进行分组,并对 price x count
进行求和以找到 subtotal
s,将其转换为数据帧,然后将 df1
与新的 subtotal
数据帧合并以创建 groupedphpcnend cphpcn 数据框。然后我使用 <code>np.where
建议创建了 totals
列(这比我的 for 循环优雅得多,并且可以轻松处理 nan 值)。最后按seller
、total
、item
Verkäufer
zu gruppieren und Preis x Anzahl
zu addieren, um den zu finden subtotal
s, konvertieren Sie sie in Datenrahmen und führen Sie dann df1
mit dem neuen subtotal
-Datenrahmen zusammen, um den Datenrahmen groupedphpcnend cphpcn zu erstellen. Anschließend habe ich die Spalte <code>totals
mit dem Vorschlag np.where
erstellt (dies ist viel eleganter als meine for-Schleife und verarbeitet Nan-Werte einfacher). Zum Schluss gruppieren Sie nach seller
, total
, item
, um die gewünschten Ergebnisse zu erhalten. Der endgültige Code lautet wie folgt: 🎜
import pandas as pd import numpy as np item1 = ['item 1', 'item 2', 'item 1', 'item 1', 'item 2'] seller1 = ['Seller 1', 'Seller 2', 'Seller 3', 'Seller 4', 'Seller 1'] price1 = [1.85, 1.94, 2.69, 2.00, 2.02] shipping1 = [0.99, 0.99, 0.99, 2.99, 0.99] freeship1 = [5, 5, 5, 50, 5] countavailable1 = [1, 2, 2, 5, 2] countneeded1 = [2, 1, 2, 2, 1] df1 = pd.DataFrame({'Seller':seller1, 'Item':item1, 'Price':price1, 'Shipping':shipping1, 'Free Shipping Minimum':freeship1, 'Count Available':countavailable1, 'Count Needed':countneeded1}) # create columns that states if seller has all counts needed. # this will be used to sort by to prioritize the smallest number of orders possible for index, row in df1.iterrows(): if row['Count Available'] >= row['Count Needed']: df1.at[index, 'Fulfills Count Needed'] = 'Yes' else: df1.at[index, 'Fulfills Count Needed'] = 'No' # dont want to calc price based on [count available], so need to check if seller has count I need and calc cost based on [count needed]. # if doesn't have [count needed], then calc cost on [count available]. for index, row in df1.iterrows(): if row['Count Available'] >= row['Count Needed']: df1.at[index, 'Price x Count'] = row['Count Needed'] * row['Price'] else: df1.at[index, 'Price x Count'] = row['Count Available'] * row['Price'] # subtotals by seller, then assign calcs to column called [Subtotal] and merge into dataframe subtotals = df1.groupby(['Seller'])['Price x Count'].sum().reset_index() subtotals.rename({'Price x Count':'Subtotal'}, axis=1, inplace=True) grouped = df1.merge(subtotals[['Subtotal', 'Seller']], on='Seller') # calc [Total] grouped['Total'] = np.where(grouped['Subtotal'] > grouped['Free Shipping Minimum'], grouped['Subtotal'], grouped['Subtotal'] + grouped['Shipping']) grouped.groupby(['Seller', 'Total', 'Item']).first()
Das obige ist der detaillierte Inhalt vonBerechnen Sie die Summe jeder Zeile des externen Index im Multi-Index-Pandas-Datenrahmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!