假设我有这样一个 Dataframe :
a b 1 5 1 7 2 3 1 3 2 5
我想对b的值求和,比如,这会给予。在Pandas身上我该怎么做?
b
o0lyfsai1#
这里的基本思想是选择要求和的数据,然后对它们求和。可以用几种不同的方法来选择数据,下面显示了其中的几种方法。
可以说,选择值的最常用方法是使用布尔索引。使用此方法,您可以找出列'a'在何处等于1,然后对列'b'的相应行求和。您可以使用loc来处理行和列的索引:
1
loc
>>> df.loc[df['a'] == 1, 'b'].sum() 15
布尔索引可以扩展到其他列。例如,如果df还包含列'c',我们想对'b'中的行求和,其中'a'为1,'c'为2,我们可以写:
df
df.loc[(df['a'] == 1) & (df['c'] == 2), 'b'].sum()
选择数据的另一种方法是使用query过滤您感兴趣的行,选择列“B”,然后求和:
query
>>> df.query("a == 1")['b'].sum() 15
同样,该方法可以被扩展以进行更复杂的数据选择:
df.query("a == 1 and c == 2")['b'].sum()
注意,这比布尔索引方法更简洁一些。
另一种方法是使用groupby根据列“a”中的值将DataFrame拆分为多个部分。然后,您可以对每个部分求和,并得出1相加后的值:
groupby
>>> df.groupby('a')['b'].sum()[1] 15
这种方法可能比使用布尔索引要慢,但如果您想检查列a中其他值的总和,这种方法很有用:
a
>>> df.groupby('a')['b'].sum() a 1 15 2 8
umuewwlo2#
你也可以不使用groupby或loc来完成这个操作,只要在代码中包含条件即可,假设 Dataframe 的名称为df,然后你可以尝试:
df[df['a']==1]['b'].sum()
或者您也可以尝试:
sum(df[df['a']==1]['b'])
另一种方法是使用python的numpy库:
import numpy as np print(np.where(df['a']==1, df['b'],0).sum())
gmol16393#
如果要将总和作为列重新分配到帧中,则可以使用groupby.transform使总和具有与原始帧相同的索引。
groupby.transform
# group by values of df.a df['b_sum_by_a'] = df.groupby('a')['b'].transform('sum') # group by whether df.a is 1 or not df['b_sum_by_a'] = df.groupby(df['a']==1)['b'].transform('sum')
3条答案
按热度按时间o0lyfsai1#
这里的基本思想是选择要求和的数据,然后对它们求和。可以用几种不同的方法来选择数据,下面显示了其中的几种方法。
布尔索引
可以说,选择值的最常用方法是使用布尔索引。
使用此方法,您可以找出列'a'在何处等于
1
,然后对列'b'的相应行求和。您可以使用loc
来处理行和列的索引:布尔索引可以扩展到其他列。例如,如果
df
还包含列'c',我们想对'b'中的行求和,其中'a'为1,'c'为2,我们可以写:查询
选择数据的另一种方法是使用
query
过滤您感兴趣的行,选择列“B”,然后求和:同样,该方法可以被扩展以进行更复杂的数据选择:
注意,这比布尔索引方法更简洁一些。
分组依据
另一种方法是使用
groupby
根据列“a”中的值将DataFrame拆分为多个部分。然后,您可以对每个部分求和,并得出1相加后的值:这种方法可能比使用布尔索引要慢,但如果您想检查列
a
中其他值的总和,这种方法很有用:umuewwlo2#
你也可以不使用groupby或loc来完成这个操作,只要在代码中包含条件即可,假设 Dataframe 的名称为df,然后你可以尝试:
或者您也可以尝试:
另一种方法是使用python的numpy库:
gmol16393#
如果要将总和作为列重新分配到帧中,则可以使用
groupby.transform
使总和具有与原始帧相同的索引。