python pandas mengelompokkan dan mengurangi kolom dari grup yang berbeda

Saya memiliki kerangka data df1

pid     stat       h1         h2       h3      h4      h5      h6     ...     h20

1        a        3.2        3.5       6.2     7.1    1.2      2.3    ...    3.2
1        b        3.3        1.5       4.2     7.7    4.2      3.5   ...     8.4
1        a        3.1        3.8       2.2     1.1    6.2      5.3   ...     9.2
1        b        3.7        1.2       8.2     4.7    3.2      8.5   ...     2.4
:        :         :          :         :       :      :        :      :      :
2        a        2.2       3.8        6.2     7.3    1.3      4.3   ...     3.2
2        b        4.3       1.3        4.2     5.7    2.2      3.1   ...     2.4
2        a        2.1       3.7        2.4     1.6    6.4      9.3   ...     9.6
2        b        3.8       1.3        8.7     3.7    7.2      8.3   ...     9.4
:        :         :         :          :       :      :        :     :       : 
3        a        2.2       3.8        6.2     7.3     1.3     4.3   ...     3.2
3        b        4.3       1.3        4.2     5.7     2.2     3.1   ...     2.4
3        a        2.1       3.7        2.4     1.6     6.4     9.3   ...     9.6
3        b        3.8       1.3        8.7     3.7     7.2     8.3   ...     9.4
  :      :         :         :          :       :       :        :     :      :

Saya ingin mendapatkan grup yang diindeks pada pid dan stat dan kemudian mengurangi h nilai grup1 dari h nilai grup2 untuk dataframe (df2) akhir. Kerangka data akhir ini perlu diindeks ulang dengan angka mulai dari 0:len(groups) Ulangi secara berulang untuk semua permutasi pid seperti 1-2, 1-3, 1-4, 2-1, 2-3 ... dll. Saya perlu melakukan yang lain perhitungan pada kerangka data akhir df2(nilai di bawah df2 tidak dikurangi secara eksak, tetapi hanya representasi)

pid(string)     stat    h1p1-h1p2   h2p1-h2p2   h3p1-h3p2   h4p1-h4p2   h5p1-h5p2   h6p1-h6p2   ...  h20p1-h2p2

   1-2           a        3.2         3.5         6.2         7.1         1.2         2.3        ...      3.2
   1-2           b        3.3         1.5         4.2         7.7         4.2         3.5        ...      8.4
   1-2           a        3.1         3.8         2.2         1.1         6.2         5.3        ...      9.2
   1-2           b        3.7         1.2         8.2         4.7         3.2         8.5        ...      2.4
   1-3      ....

Saya melihat pilihan;

  for (pid, stat), group in df1.groupby(['pid', 'stat']):
      print('pid  = %s Stat =  %s' %(pid, stat))
      print group

ini memberi saya grup tetapi, saya tidak yakin bagaimana cara mengakses kerangka data dari loop for ini dan menggunakannya untuk mengurangi dari grup lain. Juga

  df_grouped = df.groupby(['pid', 'stat']).groups()

masih tidak yakin bagaimana cara mengakses kerangka data grup baru dan melakukan operasi. Saya ingin tahu, apakah ini bisa dilakukan menggunakan groupby atau apakah ada pendekatan yang lebih baik. Terima kasih sebelumnya!


person Jagruth    schedule 06.05.2016    source sumber


Jawaban (1)


Saya menerapkan generator dan mengabaikan kolom stat karena tidak ada bedanya di grup mana pun menurut sampel Anda. Tolong beri tahu saya jika saya melakukan kesalahan.

import pandas as pd
from itertools import permutations

def subtract_group(df, col):
    pid = df['pid'].unique()

    # select piece with pid == i
    segment = lambda df, i: df[df['pid'] == i].reset_index()[col]

    for x, y in permutations(pid, 2):
        result_df = pd.DataFrame(segment(df, x) - segment(df, y))

        # rename columns
        result_df.columns=["%sp%d-%sp%d" % (c, x, c, y) for c in col]

        # insert pid column
        result_df.insert(0, 'pid', '-'.join([str(x), str(y)]))

        yield result_df

Anda dapat mengujinya dengan:

# column name in your case
columns = ['h' + str(i+1) for i in range(20)]

print next(subtract_group(df1, columns))

Semoga ini bisa membantu.

person Zhenhao Chen    schedule 07.05.2016
comment
Jawaban sempurna. Terima kasih! - person Jagruth; 09.05.2016