python pandas groupby和减去不同组的列

时间:2016-05-06 05:51:17

标签: python pandas dataframe group-by

我有一个数据帧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上编入索引的组,然后从group2的h值中减去group1的h值,以获得最终dataframedf2)。这个最终的数据帧需要使用从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或者有更好的方法来完成。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我实现了一个生成器并忽略了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))

希望它有所帮助。