使用 Pandas 的条件数据帧操作
conditional dataframe operations using Pandas
我正在对数据帧进行一些计算 A
:我想添加一个新列 RESULT
,并进行以下计算:
通常有多行具有相同的 key1
值,它们的 key2
可以是 X
或 Y
。对于具有相同 key1
的每个组:
如果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
的所有值求和,因为不依赖于 key2
的值。 C1
的值取决于 key2
,因此仅选择 df['key2'] == 'Y'
.
的值
最后如果 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
我正在对数据帧进行一些计算 A
:我想添加一个新列 RESULT
,并进行以下计算:
通常有多行具有相同的 key1
值,它们的 key2
可以是 X
或 Y
。对于具有相同 key1
的每个组:
如果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
的所有值求和,因为不依赖于 key2
的值。 C1
的值取决于 key2
,因此仅选择 df['key2'] == 'Y'
.
最后如果 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