Python / Pandas:基于单元格值的计算

3

我有这样的数据框:

   A B C D E
0  2 3 4 8 7
1  4 7 5 9 4 
2  3 4 5 7 2
3  8 9 1 3 7

我需要做类似于这样的事情:
if 'value in column A' == 2:
  'value for this row in new column' = 'value from column B' + 'value from column C'
elif 'value in column A' == 4:
   'value for this row in new column' = 'value from column B' + 'value from column D'
elif 'value in column A' == 8:
   'value for this row in new column' = 'value from column B' + 'value from column E'
else:
   'value for this row in new column' = 0

我尝试用几种方式来做这件事,例如:

1.
df['sum'][df['A'] == 2] = df['B'] + df['C']
df['sum'][df['A'] == 4] = df['B'] + df['D']
df['sum'][df['A'] == 8] = df['B'] + df['E']

2.
df.loc[df['A'] == 2, 'sum'] = df['B'] + df['C']
df.loc[df['A'] == 4, 'sum'] = df['B'] + df['D']
df.loc[df['A'] == 8, 'sum'] = df['B'] + df['E']

然而,我的结果中有空单元格。


1
你的解决方案没有处理else情况。你可能只想在处理完前三种情况后调用fillna方法,例如df.fillna(0, axis=1) - Quickbeam2k1
3个回答

5

另一种简单的方法是使用字典和 lookup,以获取总和,即

colons = {2: 'C', 4: 'D', 8: 'E'}
df['sum']= np.nan
df['sum'] = df['B']+ df.lookup(df['A'].index,df['A'].map(colons).fillna('sum'))

输出:

   A  B  C  D  E   总和
0  2  3  4  8  7   7.0
1  4  7  5  9  4  16.0
2  3  4  5  7  2   0.0
3  8  9  1  3  7  16.0

您可以使用 df.fillna(0) 方法将 nan 填充为 0。


2
我也是这么想的。回答得很好。 - piRSquared

1

这是一种方法

def f1(x):
    if x['A']==2:
        return x['B'] + x['C']
    elif x['A']==4:
        return x['B'] + x['D']
    elif x['A']==8:
        return x['B'] + x['E']
    else:
        return 0

df['sum'] = df.apply(f1 , axis=1)
df.head()

输出:
A   B   C   D   E   sum
2   3   4   8   7   7
4   7   5   9   4   16
3   4   5   7   2   0
8   9   1   3   7   16

0

你之所以会出现 NAs 的问题是因为没有处理 df.A == 3 这种情况。使用 df.loc[:,'sum'] = 0 # 或者其他任何初始值 来避免此问题。

A =[2, 4, 3, 8]
B =[3, 7, 4, 9]
C =[4, 5, 5, 1]
D =[8, 9, 7, 3]
E =[7, 4, 2, 7]

_all = [A,B,C,D,E]
df = pd.DataFrame(_all, columns = ['A', 'B', 'C', 'D', 'E'])

df.loc[:,'sum'] = 0
df.loc[:,'sum'][df['A'] == 2] = df['B'] + df['C']
df.loc[:,'sum'][df['A'] == 4] = df['B'] + df['D']
df.loc[:,'sum'][df['A'] == 8] = df['B'] + df['E']

>>> df
   A  B  C  D  E  sum
0  2  3  4  8  7    7
1  4  7  5  9  4   16
2  3  4  5  7  2    0
3  8  9  1  3  7   16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接