Python 使用Pandas的条件数据帧操作

Python 使用Pandas的条件数据帧操作,python,numpy,pandas,conditional,dataframe,Python,Numpy,Pandas,Conditional,Dataframe,我正在对数据帧a进行一些计算:我想添加一个新列RESULT,并执行以下计算: 通常有多行具有相同的key1值,它们的key2可以是X或Y。对于具有相同键1的各组: 如果key2=X,则RESULT=0, 否则,RESULT=(C1 | key2=Y)+(C2 | key2=Y)+(C2 | key2=X)。请参见A_MODIFIED A = key1 key2 C1 C2 0 A X 5 2 1

我正在对数据帧
a
进行一些计算:我想添加一个新列
RESULT
,并执行以下计算:

通常有多行具有相同的
key1
值,它们的
key2
可以是
X
Y
。对于具有相同键1的各组: 如果
key2=X
,则
RESULT=0
, 否则,
RESULT=(C1 | key2=Y)+(C2 | key2=Y)+(C2 | key2=X)
。请参见
A_MODIFIED

    A =
        key1   key2  C1    C2    
    0   A      X     5     2     
    1   A      Y     3     2     
    2   B      X     6     1     
    3   B      Y     1     3     
    4   C      Y     1     4     
    5   D      X     2     3     
    6   D      Y     1     3     

   A_MODIFIED =
       key1   key2  C1    C2    RESULT
   0   A      X     5     2     0
   1   A      Y     3     2     7
   2   B      X     6     1     0
   3   B      Y     1     3     5
   4   C      Y     1     4     5
   5   D      X     2     3     0
   6   D      Y     1     3     7
这就是我所做的:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(A.groupby('key1', sort = False).sum().ix[:, ['C2']].sum(axis=1), columns=['C2_T']).reset_index(level=1)
df2 = A[A['key2'] == 'Y']
df3 = pd.merge(df1, df2, how = 'left').set_index(df1.index)
df3.RESULT = df3.C1+ df3.C2_T

但是现在我不知道如何将它与原始的
A

合并。您可以为每个组应用函数
f

函数
f
对列
C2
的所有值求和,因为不依赖于键2的值。
C1
的值取决于
key2
,因此只有
df['key2']=='Y'
的值被选中

最后一个if
df['key2']=='X'
输出设置为
0

print A
#  key1 key2  C1  C2
#0    A    X   5   2
#1    A    Y   3   2
#2    B    X   6   1
#3    B    Y   1   3
#4    C    Y   1   4
#5    D    X   2   3
#6    D    Y   1   3

def f(df):
    df['RESULT'] = df['C2'].sum() + df['C1'].loc[df['key2'] == 'Y'].sum()
    df['RESULT'].loc[df['key2'] == 'X'] = 0
    return df

df = A.groupby('key1', sort = False).apply(f)
print df
#  key1 key2  C1  C2  RESULT
#0    A    X   5   2       0
#1    A    Y   3   2       7
#2    B    X   6   1       0
#3    B    Y   1   3       5
#4    C    Y   1   4       5
#5    D    X   2   3       0
#6    D    Y   1   3       7

您可以为每个组应用函数
f

函数
f
对列
C2
的所有值求和,因为不依赖于键2的值。
C1
的值取决于
key2
,因此只有
df['key2']=='Y'
的值被选中

最后一个if
df['key2']=='X'
输出设置为
0

print A
#  key1 key2  C1  C2
#0    A    X   5   2
#1    A    Y   3   2
#2    B    X   6   1
#3    B    Y   1   3
#4    C    Y   1   4
#5    D    X   2   3
#6    D    Y   1   3

def f(df):
    df['RESULT'] = df['C2'].sum() + df['C1'].loc[df['key2'] == 'Y'].sum()
    df['RESULT'].loc[df['key2'] == 'X'] = 0
    return df

df = A.groupby('key1', sort = False).apply(f)
print df
#  key1 key2  C1  C2  RESULT
#0    A    X   5   2       0
#1    A    Y   3   2       7
#2    B    X   6   1       0
#3    B    Y   1   3       5
#4    C    Y   1   4       5
#5    D    X   2   3       0
#6    D    Y   1   3       7

我认为你的公式没有道理<当
key2=X
时,code>RESULT=0,但是您有
…+(C2 | key2=X)
我认为你的公式没有意义<当
key2=X
时,code>RESULT=0,但是您有
…+(C2 |键2=X)