2017-02-22 6 views
0

У меня есть таблица данных, подобная этой.Pandas: создать повторяющиеся строки с определенными столбцами, измененными

A B1 B2 B3  C 
3 1 2 0 'foo' 
5 1 4 5 'bar' 
7 0 3 0 'baz' 
8 0 0 0 'foo' 

Я хотел бы создать новую таблицу данных, которая выглядит следующим образом:

A B  C 
1.5 1 'foo' 
1.5 2 'foo' 
1.67 1 'bar' 
1.67 4 'bar' 
1.67 5 'bar' 
    7 3 'baz' 
    8 0 'foo' 

в соответствии со следующими правилами:

  1. Если ни один из B# столбцов не равен нулю, создайте одну новую строку с A без изменений и B = 0.
  2. Если n >= 1 из B# столбцов равны нулю, а затем создать n новые строки, каждая из которых A изменено на A/n и B равным одному из ненулевых B# столбцов.

C Осталось в покое. Меня не волнует порядок новых строк. Фактическая таблица данных, с которой я имею дело, - это десятки мегабайт, поэтому, если возможно, я бы предпочел решения, которые избегают ненужного повторного копирования.

ответ

0

Вот функция, которая делает вещи:

def transform(df): 
    """ Iterate over rows of transformed dataframe. """ 

    for i, r in df.iterrows(): 
     # count number of B# that equal to 0 
     n = sum(r[1:3] == 0) 

     if n == 0: 
      yield [r.A, 0, r.C] 
     else: 
      yield [r.A/n, r.B1, r.C] 
      yield [r.A/n, r.B2, r.C] 
      yield [r.A/n, r.B3, r.C] 

new_df = pd.DataFrame(transform(df)) 
Смежные вопросы