2017-02-22 11 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を変更せずに新しい行を1つ作成し、B = 0を作成します。 B#列のn >= 1がゼロである場合
  2. 、次いでn新しい行、A/n及び非ゼロB#列の1に等しいBに変更A各を作成します。

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)) 
関連する問題