pandas: изменение значений при повторении строк

#python #pandas

#python #pandas

Вопрос:

Вот мой df:

 import pandas as pd
import numpy as np

d = {'number': ['12A', '12B', '23A', '23B', '23B'],
     'code': ['Q1A', 'Q1A', 'Q1A', 'Q1A', 'Q1B'],
     'symbole': ['ABC', 'ABC', 'XYZ', 'XZY', 'GFD'],
     'qty': [-100, 100, -20, 20, 0]}
df = pd.DataFrame(data=d)
df

  number code symbole  qty
0    12A  Q1A     ABC -100
1    12B  Q1A     ABC  100
2    23A  Q1A     XYZ  -20
3    23B  Q1A     XZY   20
4    23B  Q1B     ABC   0
  

Я выполняю базовые манипуляции:

 df = df.loc[df['code'] == 'Q1A']
df['new'] = np.where(df['qty'] > 0, 'buy', 'sell')
df['new2'] = 'cash'
df

  number code symbole  qty   new  new2
0    12A  Q1A     ABC -100  sell  cash
1    12B  Q1A     ABC  100   buy  cash
2    23A  Q1A     XYZ  -20  sell  cash
3    23B  Q1A     XZY   20   buy  cash
  

Теперь я хочу дублировать каждую строку при изменении значения моих 2 новых столбцов.

Настройки:

  1. обратное количество
  2. если sell, замените на buy, а если buy, замените на sell
  3. если cash, замените на asset, а если asset, замените на cash

Желаемый результат:

   number code symbole  qty   new  new2
0    12A  Q1A     ABC -100  sell  cash
0    12A  Q1A     ABC  100   buy  asset
1    12B  Q1A     ABC  100   buy  cash
1    12B  Q1A     ABC  -100 sell  asset
  

и так далее.

Кажется, я не могу понять, как это сделать. Я написал свои манипуляции, потому что подумал, что это может помочь, если возможна упрощенная версия.

Ответ №1:

Сначала выполните df2 = df[:] # copy df to df2

Обратное qty :

 df2["qty"] = -df["qty"]
  

Обратное new :

 df2["new"] = ["buy" if ele  == "sell" else "sell" for ele in df["new"]]
  

Инверсии new2 :

 df2["new2"] = ["cash" if ele  == "asset" else "asset" for ele in df["new2"]]
  

Теперь объедините их:

 df = pd.concat([df, df2])
  

Результат:

   number code symbole  qty   new   new2
0    12A  Q1A     ABC -100  sell   cash
1    12B  Q1A     ABC  100   buy   cash
2    23A  Q1A     XYZ  -20  sell   cash
3    23B  Q1A     XZY   20   buy   cash
0    12A  Q1A     ABC -100  sell  asset
1    12B  Q1A     ABC  100   buy  asset
2    23A  Q1A     XYZ  -20  sell  asset
3    23B  Q1A     XZY   20   buy  asset