pandas 是否有一种方法可以基于现有的行值向数据集添加新行?

0md85ypi  于 2023-04-28  发布在  其他
关注(0)|答案(3)|浏览(123)
国家制造商分类销售额(美元)
CAABY一百
TXABY五十
美国共计ABY两百
CACDZ三十
TXCDZ六十
美国共计CDZ一百

我使用的数据集看起来像上图:我有大多数州的州级数据和一个Total US级行。因为我缺少一些州,所以我尝试为每个制造商-类别组合创建新行,其中State =“All Other States”。Sales $列是Total US与我拥有的州的销售额之和之间的差值。请参阅下面我尝试实现的端点:
| 国家|制造商|分类|销售额(美元)|
| --------------|--------------|--------------|--------------|
| CA|AB|Y|一百|
| TX|AB|Y|五十|
| 美国共计|AB|Y|两百|
| 所有其他国家|AB|Y|五十|
| CA|CD|Z|三十|
| TX|CD|Z|六十|
| 美国共计|CD|Z|一百|
| 所有其他国家|CD|Z|10个|
这样的事情是否可能/如何在Python/Pandas中实现这一点?
谢谢!

xtupzzrd

xtupzzrd1#

尝试下面的操作。对数据进行排序,以确保“所有其他状态”排在最后。之后,对数据进行分组,并从总数中减去“所有其他状态”中的值,然后将其添加到原始df

c = ['Manufacturer','Category']

df = df.sort_values('State',key = lambda x: x.eq('Total US'))

df2 = df.groupby(c)['Sales $'].agg(lambda x: x.iloc[-1] * 2 - x.sum()).reset_index()

df = pd.concat([df,df2],ignore_index=True).fillna({'State':'All Other States'}).sort_values(c)

输出:

State Manufacturer Category  Sales $
0                CA           AB        Y      100
1                TX           AB        Y       50
4          Total US           AB        Y      200
6  All Other States           AB        Y       50
2                CA           CD        Z       30
3                TX           CD        Z       60
5          Total US           CD        Z      100
7  All Other States           CD        Z       10
q3aa0525

q3aa05252#

我的解决方案不是使用迭代,而是使用concat和groupby函数:首先,我将创建一个临时列('sales 2')来存储负数值,其中'State'!='Total US'

df['Sales2']=np.where(df['State']!='Total US',df['Sales $']*-1,df['Sales $'])

现在,我将创建一个名为“Others”的新数据框架,其中我将使用groupby对Manufacturer和Category进行分组,然后使用sum 2列对值求和。

Others=df.groupby(['Manufacturer','Category'],as_index=False)[['Sales2']].sum().rename(columns={'Sales2':'Sales $'})

然后我将添加一个新列到'Other' dataframe:

Others['State']= 'All Other States'

df=(

pd.concat([df,Others],axis=0).sort_values
(['Manufacturer','Category']).reset_index(drop=True).
drop(columns='Sales2')
)
jaxagkaj

jaxagkaj3#

拟定脚本

import pandas as pd

df = pd.DataFrame({'State' : ["CA", "TX", "Total US", "CA", "TX", "Total US"],
                   'Manufacturer' : ["AB", "AB", "AB", "CD", "CD", "CD"],
                   'Category' : ["Y", "Y", "Y", "Z", "Z", "Z"],
                   'Sales $' : [100, 50, 200, 30, 60, 100]
                   })

r = (df.groupby(['Manufacturer', 'Category'])
       .apply(lambda g: g[g['State'].eq("Total US")].loc[:, 'Sales $']
                .sub( g[g['State'].ne("Total US")].loc[:, 'Sales $'].sum() ))
      ).reset_index(level=[0,1])

r['State'] = 'All Other States'

df = (df.merge(r, how='outer')
        .sort_values(['Manufacturer', 'State'])
        .reset_index(drop=True)
        )

print(df)

输出

State Manufacturer Category  Sales $
0  All Other States           AB        Y       50
1                CA           AB        Y      100
2                TX           AB        Y       50
3          Total US           AB        Y      200
4  All Other States           CD        Z       10
5                CA           CD        Z       30
6                TX           CD        Z       60
7          Total US           CD        Z      100

留言

如果要对其他列进行计算,请更改参数:
.loc[:, 'Sales $']替换为.loc[:, ['Sales $', 'Units sold']]

相关问题