2015-05-09 3 views
2

Учитывая следующий dataframe в пандВставка строк по значению столбцов в панд dataframes

date  action price  
    20150101 buy  10 
    20150102 buy  9 
    20150103 sell  11 
    20150104 sell  10 
    20150105 buy  8 
    20150106 sell  9 

Если я хочу, чтобы добавить строки, когда «продать» превратят в «купить», и вставленной строки является просто копией предыдущей строки, кроме изменения «продать» на «покупку», например, следующим образом:

date  action price  
    20150101 buy  10 
    20150102 buy  9 
    20150103 sell  11 
    20150104 sell  10 
**20150104 buy  10** 
    20150105 buy  8 
    20150106 sell  9 
**20150106 buy  9 ** 

Спасибо за помощь.

ответ

3

Вы можете определить строки перехода с использованием

mask = (df['action'] == 'sell') & (df['action'].shift(-1) != 'sell') 
# In [229]: mask 
# Out[229]: 
# 0 False 
# 1 False 
# 2 False 
# 3  True 
# 4 False 
# 5  True 
# Name: action, dtype: bool 

Тогда вы могли бы сделать новый DataFrame, состоящий из строк, где mask истинно:

new = df.loc[mask].copy() 

Установить действие на 'buy':

new['action'] = 'buy' 
#  date action price 
# 3 20150104 buy  10 
# 5 20150106 buy  9 

Создайте новый DataFrame, который объединяет Tates df и new:

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

и сортировать по date:

df = df.sort(['date']) 

Например,

import pandas as pd 
df = pd.read_table('data', sep='\s+') 
mask = (df['action'] == 'sell') & (df['action'].shift(-1) != 'sell') 
new = df.loc[mask].copy() 
new['action'] = 'buy' 
df = pd.concat([df, new]) 
df = df.sort(['date']) 
df = df.reset_index(drop=True) 
print(df) 

дает

 date action price 
0 20150101 buy  10 
1 20150102 buy  9 
2 20150103 sell  11 
3 20150104 sell  10 
4 20150104 buy  10 
5 20150105 buy  8 
6 20150106 sell  9 
7 20150106 buy  9 
Смежные вопросы