Предполагая, что DataFrame
отсортировано по ID
, вы можете решить это O (n):
import pandas as pd
df = pd.DataFrame({'ID':[1,1,1,1,2,2,2,2],
'reason':['B','A','B','A','A','A','B','A'],
'result':['W','W','Z','X','X','W','Z','W']})
df['Previous_reason'] = [''] * len(df)
df['Previous_result_reasonA'] = [''] * len(df)
result_reasonA = ''
for r in range(1, len(df)):
if df['ID'][r] == df['ID'][r-1]:
df.loc[r, 'Previous_reason'] = \
df['Previous_reason'][r-1] + '|' + df['reason'][r-1]
df.loc[r, 'Previous_result_reasonA'] = \
df['Previous_result_reasonA'][r-1]
if result_reasonA:
df.loc[r, 'Previous_result_reasonA'] += \
'|' + result_reasonA
else:
df.loc[r, 'Previous_reason'] = ''
if df['reason'][r] == 'A':
result_reasonA = df['result'][r]
else:
result_reasonA = ''
# Clear trailing `|` separators
df['Previous_reason'] = \
df['Previous_reason'].apply(lambda x: x[1:])
df['Previous_result_reasonA'] = \
df['Previous_result_reasonA'].apply(lambda x: x[1:])
print df
Выход:
ID reason result Previous_reason Previous_result_reasonA
0 1 B W
1 1 A W B
2 1 B Z B|A W
3 1 A X B|A|B W
4 2 A X
5 2 A W A X
6 2 B Z A|A X|W
7 2 A W A|A|B X|W
Однако вопрос в том, охватываются ли все особые случаи. Об этом я не могу знать, так как не знаю значения данных.