2016-08-31 4 views
4

У меня есть DataFrame:Вставка строки в базу данных pandas на основе значения строки?

df = pd.DataFrame({'B':[2,1,2],'C':['a','b','a']}) 
    B C 
0 2 'a' 
1 1 'b' 
2 2 'a' 

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

B C 
0 2 'a' 
1 1 'b' 
1 1 'c' 
2 2 'a' 

В течение жизни я не могу понять, как это сделать.

+1

вы сказали выше, но на выходе его ниже, ваш первый df производит 'a' вместо' c' в третьей строке. – shivsn

+1

Что делать, если есть две последовательные строки с 'b'? – Divakar

+0

@shivsn извините, опечатка – BobbyJohnsonOG

ответ

3

Вот один из способов сделать это:

duplicates = df[df['C'] == 'b'].copy() 
duplicates['C'] = 'c' 
df.append(duplicates).sort_index() 
+0

Кажется, что нужно работать! Хорошее решение для панд. – Divakar

+0

Красивая, не понимала, что есть функция копирования! – BobbyJohnsonOG

1

Работы на уровне NumPy, вот Векторизованный подход -

arr = df.values 
idx = np.flatnonzero(df.C=='b') 
newvals = arr[idx] 
newvals[:,df.columns.get_loc("C")] = 'c' 
out = np.insert(arr,idx+1,newvals,axis=0) 
df_index = np.insert(np.arange(arr.shape[0]),idx+1,idx,axis=0) 
df_out = pd.DataFrame(out,index=df_index) 

Пример запуск -

In [149]: df 
Out[149]: 
    B C 
0 2 a 
1 1 b 
2 2 d 
3 4 d 
4 3 b 
5 8 a 
6 4 a 
7 2 b 

In [150]: df_out 
Out[150]: 
    0 1 
0 2 a 
1 1 b 
1 1 c 
2 2 d 
3 4 d 
4 3 b 
4 3 c 
5 8 a 
6 4 a 
7 2 b 
7 2 c 
Смежные вопросы