#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 новых столбцов.
Настройки:
- обратное количество
- если sell, замените на buy, а если buy, замените на sell
- если 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