簡體   English   中英

python pandas groupby和減去不同組的列

[英]python pandas groupby and subtract columns from different groups

我有一個數據幀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
  :      :         :         :          :       :       :        :     :      :

我想獲得索引的組pidstat ,然后減去h從組1的值h組2的值的最終dataframedf2 )。 這個最終的數據幀需要使用從0:len(groups)開始的數字重新編制索引0:len(groups)迭代重復pid的所有排列,如1-2,1-3,1-4,2-1,2-3 ......等。我需要在最終的數據幀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

這給了我組,但是,我不知道如何從這個for循環訪問數據幀並使用它從其他組中減去。

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

仍然不確定如何訪問組的新數據幀並執行操作。 我想知道,如果可以使用groupby或者有更好的方法來完成。 提前致謝!

我實現了一個生成器並忽略了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))

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM