Python新行,包含基于条件的其他行的总和

2024-04-29 20:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe看起来是这样的(还有其他列需要保留但未被触及,它们可以在新行中用assetClass = 99为空):

clientID  date         assetClass   value
10111     01-01-2020   1            10
10111     01-01-2020   2            20
10111     01-01-2020   3            30
10111     02-01-2020   1            15
10111     02-01-2020   2            25
10111     02-01-2020   3            35        

从1到18有几个客户和资产类别。 这是系统的原始输出

我需要创建一个新的assetClass,称之为99,它由2和3的总和(实际上是11-16)组成,按dateclientID分组,创建一个dataframe如下所示:

clientID  date         assetClass   value
10111     01-01-2020   1            10
10111     01-01-2020   2            20
10111     01-01-2020   3            30
10111     01-01-2020   99           50
10111     02-01-2020   1            15
10111     02-01-2020   2            25
10111     02-01-2020   3            35
10111     02-01-2020   99           60

我像个疯子一样在谷歌上搜索,但我认为我对这个过程应该叫什么缺乏知识

我自己试图解决它,但却一事无成,所以我没有相关的代码可以展示——我该怎么做


Tags: 代码dataframedate客户value过程系统资产
3条回答

我认为一些布尔掩蔽已经到位。对格式错误表示歉意。在手机上

mask_date = (df[‘date’]==date)
mask_assetClass = (df[‘assetClass’].isin(listOfAssets))
mask = (mask_date & mask_assetClass)
value_sum = df.loc[mask,’value’].sum()

我不确定这是否是添加新数据的正确方法

df=df.append({‘clientID’:10111,’date’:date,‘assetClass’:99,’value’:value_sum})

我认为您需要使用额外的资产类创建一个新的数据框架。例如:

df_new = df.loc[df['assetClass'].isin([2, 3])].copy()
df_new = df_new.groupby(['date', 'clientID'])['value'].sum().reset_index()
df_new['assetClass'] = 99

df = pd.concat([df, df_new])

我找不到比这更精干的方法了

下面是我测试过的工作代码的简短说明,您不必显式复制

result = df.loc[df['assetClass'].isin([2,3])].groupby(['clientID','date']).sum() #first select rows from 'assetClass' having values 2 and 3. 
#Then groupby clientID and date and then sum
result['assetClass'] = 99 # equate assetClass to 99
df = df.append(result) # merge this to existing dataframe

相关问题 更多 >