从特定条件的列中减去值并获取新的DataFrame

时间:2017-09-04 07:08:53

标签: python pandas dataframe

我有一个包含两列的数据集,我想对特定列进行一些操作并完全获得一个新的数据帧。将此视为我的数据集:

 <DocumentViewer>
     <DocumentViewer.Resources>
         <!-- Toolbar -->          
         <Style TargetType="ToolBar">
             <Setter Property="Visibility" Value="Collapsed" />
         </Style>
          <!-- Search -->
         <Style TargetType="ContentControl">
             <Setter Property="Visibility" Value="Collapsed" />
         </Style>
     </DocumentViewer.Resources>
</DocumentViewer>

我想在B列上执行两个操作,并创建一个包含这两列的数据帧。第1列将是1的最高数字,即108减去其最小值 - 1(108 - 1),2 - (89 - 23),如果它是单个实例,它应该直接为0.第二列将是特定的数字,假设它被A减去了第一个值,即(125 - 1),(125 - 23),(125 - 13)......我们应该得到这样的结果:

A   B
1   01
1   56
1   89
1   108
2   23
2   36
2   89
3   13
4   45

我正在考虑使用.loc来查找值的具体位置然后减去它,我应该怎么做?

3 个答案:

答案 0 :(得分:3)

使用first的{​​{3}}和lambda的自定义函数,然后重命名列并用125减去D

df = df.groupby('A')['B'].agg([lambda x: x.max() - x.min(), 'first']) \
                         .rename(columns={'first':'D','<lambda>':'C'}) \
                         .assign(D= lambda x: 125 - x['D']) \
                         .reset_index() 
print (df)
   A    C    D
0  1  107  124
1  2   66  102
2  3    0  112
3  4    0   80

rename是必要的,因为agg

另一种解决方案:

df = df.groupby('A')['B'].agg(['min','max', 'first']) \
                         .rename(columns={'first':'D','min':'C'}) \
                         .assign(D=lambda x: 125 - x['D'], C=lambda x: x['max'] - x['C']) \
                         .drop('max', axis=1) \
                         .reset_index() 
print (df)
   A    C    D
0  1  107  124
1  2   66  102
2  3    0  112
3  4    0   80

答案 1 :(得分:0)

u = df.groupby('A').agg(['max', 'min', 'first'])
u.columns = 'max', 'min', 'first'
u['C'] = u['max'] - u['min']
u['D'] = 125 - u['first']
del u['min']
del u['max']
del u['first']
u.reset_index()
#   A    C    D
#0  1  107  124
#1  2   66  102
#2  3    0  112
#3  4    0   80

答案 2 :(得分:0)

你可以

In [1494]: df.groupby('A', as_index=False).B.agg(
              {'C': lambda x: x.max() - x.min(), 'D': lambda x: 125-x.iloc[0]})
Out[1494]:
   A    C    D
0  1  107  124
1  2   66  102
2  3    0  112
3  4    0   80