2015-05-27 4 views
0

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.

ответ

1

Что я хотел бы сделать, это установить индекс в df1 в столбец «full_code», а затем позвонить sub, чтобы вычесть другой df.

То, что мы передаем для значений, является результатом группировки на 'full_code' и вызовом sum в столбце «сумма».

Дополнительные пары для sub является fill_values это потому, что продукт «CCC» не существует на правой части, поэтому мы хотим, чтобы это значение будет сохранены, в противном случае он становится NaN:

In [25]: 

total = df1.set_index('full_code')['in_stock'].sub(df2.groupby('full_code')['amount'].sum(), fill_value=0) 
total.reset_index() 
​ 
Out[25]: 
    full_code in_stock 
0  AAA  120 
1  BBB  100 
2  CCC  150 
+0

Спасибо, и еще один вопрос: на самом деле в df1 у меня много столбцов. Этот код выбрасывает все столбцы, кроме full_code и in_stock, есть ли другой способ сохранить их в живых? –

+0

Вы можете просто назначить/слить этот результат обратно на свой df, поэтому, используя приведенный выше код, вы можете сделать 'df1.merge (total.reset_index(), on = 'full_code')' Я думаю, что должен работать – EdChum

+0

Я пробовал '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 ... –

Смежные вопросы