2015-10-01 5 views
2

У меня есть панд dataframe, который выглядит следующим образом:Создать новую строку, если значение столбца существует

enter image description here

Я хотел бы перебирать колонок 3, и если элемент существует, добавьте новую строку в dataframe , используя значение в столбце 3 в качестве нового значения в столбце 2, а также используя данные в столбцах 0 и 1 из строки, где оно было найдено как значения для столбцов 0 и 1 во вновь добавленной строке:

enter image description here

Здесь строка 2 - это новая добавленная строка. Значения в столбцах 0 и 1 в этой строке исходят из строки, где было найдено «D», а теперь столбец 2 новой строки содержит значение из столбца 3 в первой строке «D».

Вот один из способов сделать это, но, безусловно, должна быть более общим решением, особенно если я хочу, чтобы сканировать более одной колонки:

a = pd.DataFrame([['A','B','C','D'],[1,2,'C']]) 
b = a.copy() 
for tu in a.itertuples(index=False):   # Iterate by row 
    if tu[3]:        # If exists 
     b = b.append([[tu[0],tu[1],tu[3]]], ignore_index=True) # Append with new row using correct tuple elements. 

ответ

1

вы можете сделать это без каких-либо петель, создавая новый ДФ с колонками, которые вы хотите, и добавляет его в оригинале.

import pandas as pd 
import numpy as np 

df = pd.DataFrame([['A','B','C','D'],[1,2,'C']]) 

ndf = df[pd.notnull(df[3])][[0,1,3]] 
ndf.columns = [0,1,2] 
df = df.append(ndf, ignore_index=True) 

Это оставит NaN для новых отсутствующих значений, которые вы можете изменить, а затем измените на None.

df[3] = df[3].where((pd.notnull(df[3])), None) 

печатает

0 1 2  3 
0 A B C  D 
1 1 2 C None 
2 A B D None 
+1

С моих реальных ДФ используемых строк в качестве имен столбцов, у меня была проблема с колоннами быть заказана при использовании 'append'. Чтобы разрешить это, я записал исходные имена столбцов как 'df_cols', а затем использовал' df = df.reindex_axis (df_cols, axis = 1) 'в добавленном фрейме. – AGS

0

Это может быть немного более общим (при условии, ваши столбцы представляют собой целые числа, и что вы всегда ищете, чтобы заполнить предыдущие столбцы в этой модели)

import pandas as pd 

def append_rows(scan_row,scanned_dataframe): 
    new_df = pd.DataFrame() 
    for i,row in scanned_dataframe.iterrows(): 
     if row[scan_row]: 
      new_row = [row[i] for i in range(scan_row -1)] 
      new_row.append(row[scan_row]) 
      print new_row 
      new_df = new_df.append([new_row],ignore_index=True) 
    return new_df 

a = pd.DataFrame([['A','B','C','D'],[1,2,'C']]) 
b = a.copy() 

b = b.append(append_rows(3,a)) 
Смежные вопросы