EDITED: дайте мне скопировать весь набор данныхзначения подсчета между двумя пандами dataframe на основе значения столбца
ФР данные продаж магазина/инвентарные
branch daqu store store_name style color size stocked sold in_stock balance
0 huadong wenning C301 EE #��#��##�� EEBW52301M 39 160 7 4 3 -5
1 huadong wenning C301 EE #��#��##�� EEBW52301M 39 165 1 0 1 1
2 huadong wenning C301 EE #��#��##�� EEBW52301M 39 170 6 3 3 -3
дк является сделкой (движение «сумма "из магазина„от“до„до“)
branch daqu from to style color size amount box_sum
8 huadong shanghai C306 C30C EEOM52301M 59 160 1 162
18 huadong shanghai C306 C30C EEOM52301M 39 160 1 162
25 huadong shanghai C306 C30C EETJ52301M 52 160 9 162
26 huadong shanghai C306 C30C EETJ52301M 52 155 1 162
32 huadong shanghai C306 C30C EEOW52352M 19 160 2 162
то, что я хочу, это хранилище данных инвентаризации после операции, которая будет выглядеть точно такой же формат, что и ФР, но только„числа in_stock“будет иметь изменено с оригинала df в соответствии с числами в dh.
ниже того, что я пробовал:
df['full_code'] = df['store']+df['style']+df['color'].astype(str)+df['size'].astype(str)
dh['from_code'] = dh['from']+dh['style']+dh['color'].astype(str)+dh['size'].astype(str)
dh['to_code'] = dh['to']+dh['style']+dh['color'].astype(str)+dh['size'].astype(str)
# subtract from 'from' store
dh_from = pd.DataFrame(dh.groupby('from_code')['amount'].sum())
for code, stock in dh_from.iterrows() :
df.loc[df['full_code'] == code, 'in_stock'] = df.loc[df['full_code'] == code, 'in_stock'] - stock
# add to 'to' store
dh_to = pd.DataFrame(dh.groupby('to_code')['amount'].sum())
for code, stock in dh_to.iterrows() :
df.loc[df['full_code'] == code, 'in_stock'] = df.loc[df['full_code'] == code, 'in_stock'] + stock
df.to_csv('d:/after_dh.csv')
Но когда я открываю файл CSV, то значения «in_stock» для тех, которые сделки произошедшей все заготовки. думаю df.loc[df['full_code'] == code, 'in_stock'] = df.loc[df['full_code'] == code, 'in_stock'] + stock
это есть проблема. Каков правильный способ обновления стоимости?
ORIGINAL: У меня есть две панды dataframe: df1 для инвентаря, df2 для сделки
df1 выглядеть примерно так:
full_code in_stock
1 AAA 200
2 BBB 150
3 CCC 150
df2 выглядеть примерно так:
from to full_code amount
1 XX XY AAA 30
2 XX XZ AAA 35
3 ZY OI BBB 50
4 AQ TR AAA 15
Что я хочу - это инвентарь после завершения всех транзакций. В этом случае
full_code in_stock
1 AAA 120
2 BBB 100
3 CCC 150
Обратите внимание, что full_code является уникальным в df1, но не единственный в df2. Есть ли способ панды сделать это? Я перепутался с исходным фреймворком данных и представлением о кадре данных и решил его решить, превратив их в массив numpy и найти соответствующие полные_коды. Но полученный код также беспорядок и удивление, если есть более простой способ сделать это, не превращая все в массив numpy.
Спасибо, и еще один вопрос: на самом деле в df1 у меня много столбцов. Этот код выбрасывает все столбцы, кроме full_code и in_stock, есть ли другой способ сохранить их в живых? –
Вы можете просто назначить/слить этот результат обратно на свой df, поэтому, используя приведенный выше код, вы можете сделать 'df1.merge (total.reset_index(), on = 'full_code')' Я думаю, что должен работать – EdChum
Я пробовал 'df1 = df.set_index ('full_code') ['in_stock']. sub (dh_final.groupby ('full_code') ['amount']. sum(), fill_value = 0) df1.reset_index() df1.columns = ['full_code', 'in_stock'] Тип печати (df1) print df1.head (5) ', но он дает' full_code C301EEBW52301M39160 3 C301EEBW52301M39165 1 C301EEBW52301M39170 3 C301EEBW52301M51160 1 C301EEBW52301M51165 1 Имя: in_stock, DTYPE: float64' Интересно, почему df.sub() возвращает серию вместо dataframe ... –