【问题标题】:Calculate values difference in column based on their catageories grouped by ID根据按 ID 分组的类别计算列中的值差异
【发布时间】:2019-04-11 01:42:04
【问题描述】:

我想通过存储在每个 ID 组的另一列中的状态来计算值的差异。

数据集是:

# Create the dataframe
d = {'ID': ['1', '1', '1', '1', '2', '2', '2', '2'], 
     'Category': ['A','B','C','D','A','B','C','D'],
     'Value': ['5','9','10','11','8','13','20','25']} 
df = pd.DataFrame(data=d)

数据集如下所示:

ID Category Value
1    A        5
1    B        9
1    C        10
1    D        11
2    A        8
2    B        13
2    C        20
2    D        25

例如,我想计算每个 ID 的 B 类和 D 类值的差异。但我不确定我应该如何将计算与 groupby 结合起来。

理想的数据集应该是:

ID   diff(B,D)
1    2
2    12

感谢任何人回答这个问题!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以在使用isin 过滤后使用groupbydiff

    df.Value=pd.to_numeric(df.Value)
    
    yourdf=df.loc[df['Category'].isin(['B','D'])].set_index('ID').groupby(level=0)['Value'].diff().dropna()
    yourdf
    Out[75]: 
    ID
    1     2.0
    2    12.0
    Name: Value, dtype: float64
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用 MultiIndex

      df2 = df.set_index(['ID', 'Category']).unstack(-1).xs('Value', axis=1, drop_level=True)
      
      Category  A   B   C   D
      ID                     
      1         5   9  10  11
      2         8  13  20  25
      
      df2 = df2.apply(pd.to_numeric)
      df2['D'] - df2['B']
      
      ID
      1     2
      2    12
      dtype: int64
      

      【讨论】:

        【解决方案3】:

        您也可以尝试使用pivot_table,然后使用传统的差异公式:

        d = {'ID': ['1', '1', '1', '1', '2', '2', '2', '2'], 
             'Category': ['A','B','C','D','A','B','C','D'],
             'Value': ['5','9','10','11','8','13','20','25']} 
        df = pd.DataFrame(data=d)
        df.Value=pd.to_numeric(df.Value)
        aa = df['Category'].unique()
        
        # using a pivot table function to define in the column and then calculating the difference
        df = df.pivot_table(index=['ID'],columns='Category',values='Value')
        df['diff'] = df['D'] - df['B']
        df = df.drop(columns=aa,axis=0)
        
        
        output:
        Category    diff
        ID  
        1           2
        2           12
        

        如果它对你有用,请告诉我。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-29
          • 2020-04-10
          • 1970-01-01
          • 2020-03-19
          • 2019-02-17
          • 1970-01-01
          相关资源
          最近更新 更多