Pandas,将一行中的值相加形成一个 "totals" 列

Pandas, summing values in a row to form a "totals" column

所以我一直在尝试获取行的总和并将它们添加到新列中。我的数据是这样的:

     Animal  num1  num2 
0    22-14  36.6   213      
1    39-14  42.44  141      
2    40-14  39     157

我已经尝试过诸如:

df['sum'] = df['num1'] + df['num2']

但这只是将信息组合在一起,并没有求和。有办法吗?

您的问题是您的列实际上是字符串,而不是数字。当您尝试对列求和时,字符串只是连接起来(例如 'cat' + 'dog' 变为 'catdog')。

您可以使用 pandas.DataFrame.convert_objects 将它们转换为数字。

import pandas as pd
from io import StringIO

s = """     Animal  num1  num2 
0    22-14  36.6   213      
1    39-14  42.44  141      
2    40-14  39     157"""

df = pd.read_csv(StringIO(s), sep='\s+', dtype=str)

# You can ignore the code above this point, I was just re-creating your DataFrame.
df = df.convert_objects(convert_numeric=True)

在此之后,它应该完全按照您上面所说的工作,所以:

df['sum'] = df['num1'] + df['num2']

print(df)
#  Animal   num1  num2     sum
#0  22-14  36.60   213  249.60
#1  39-14  42.44   141  183.44
#2  40-14  39.00   157  196.00

sum 命令带有一个轴参数,可用于对列 (1) 或行 (0) 求和。

df = pd.DataFrame({'a':[4,5,2],'b':[5,2,9]})
df['c'] = df.sum(axis=1)

此方法只接受数字,您的第一列是一个字符串,因此您必须对其进行解析。例如,如果你想从数字中删除连字符,你可以使用命令:

df['Animal'] = df['Animal'].apply(lambda x: int(x.replace('-','')))

或者,如果您想完全忽略第一列,您可以简单地不包含它。

df['sum'] = df.iloc[:,1:].sum(axis = 1)