python pandas groupby และลบคอลัมน์ออกจากกลุ่มต่างๆ

ฉันมีดาต้าเฟรม 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
  :      :         :         :          :       :       :        :     :      :

ฉันต้องการรับกลุ่มที่มีการจัดทำดัชนีใน pid และ stat แล้วลบค่า h ของ group1 ออกจากค่า h ของ group2 สำหรับ dataframe สุดท้าย (df2) dataframe สุดท้ายนี้จำเป็นต้องได้รับการจัดทำดัชนีใหม่ด้วยตัวเลขที่เริ่มต้นจาก 0:len(groups) ทำซ้ำซ้ำๆ สำหรับการเรียงสับเปลี่ยนของ pid เช่น 1-2, 1-3, 1-4, 2-1, 2-3 ... ฯลฯ ฉันต้องทำอย่างอื่น การคำนวณบน dataframe สุดท้าย df2 (ค่าใน df2 ด้านล่างไม่ได้ถูกลบออกทุกประการ แต่เป็นเพียงการแสดงแทน)

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      ....

ฉันดูตัวเลือกของ;

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

สิ่งนี้ทำให้ฉันมีกลุ่ม แต่ฉันไม่แน่ใจว่าจะเข้าถึง dataframes จากสิ่งนี้ for loop ได้อย่างไรและใช้เพื่อลบออกจากกลุ่มอื่น อีกด้วย

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

ยังไม่แน่ใจว่าจะเข้าถึง dataframe ใหม่ของกลุ่มและดำเนินการอย่างไร ฉันต้องการทราบว่าสามารถทำได้โดยใช้ groupby หรือมีแนวทางที่ดีกว่านี้หรือไม่ ขอบคุณล่วงหน้า!


person Jagruth    schedule 06.05.2016    source แหล่งที่มา


คำตอบ (1)


ฉันใช้ตัวสร้างและละเว้นคอลัมน์ stat เนื่องจากมันไม่สร้างความแตกต่างในกลุ่มใดๆ ตามตัวอย่างของคุณ โปรดบอกฉันหากฉันทำผิด

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

คุณสามารถทดสอบด้วย:

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

print next(subtract_group(df1, columns))

หวังว่ามันจะช่วยได้

person Zhenhao Chen    schedule 07.05.2016
comment
คำตอบที่สมบูรณ์แบบ ขอบคุณ! - person Jagruth; 09.05.2016