2017-02-22 72 views
0

我有一个这样的数据表。熊猫:创建重复的行,修改某些列

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. 如果B#n >= 1是零,则创建新n行,每行A改为A/nB等于非零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))