根据其他行的条件添加数据帧行

2024-06-25 05:27:52 发布

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

有没有一种方法可以基于数据帧中的其他行向数据帧添加行

我有一个看起来像这样的数据框:

Year   Month   Project   Account   Value
2020   Jan     abc       Revenue   100
2020   Jan     xyz       Profit    20
2020   Jan     abc       Profit    10
2020   Jan     xyz       Revenue   350

我想对所有有收入账户的行进行计算,公式应该是相同的所有列(年、月、项目)的成本=收入-利润(所有行都是唯一的,因此每个计算只有一个可能的匹配)

所以结果看起来像

Year   Month   Project   Account   Value
2020   Jan     abc       Revenue   100
2020   Jan     xyz       Profit    20
2020   Jan     abc       Profit    10
2020   Jan     xyz       Revenue   350
2020   Jan     abc       Cost      90
2020   Jan     xyz       Cost      340

我对熊猫还很陌生,但在我所做的所有搜索中,我还没有找到一种Python式的方法来对付熊猫。数据集非常大(100K+行),因此我不想迭代计算,但如果必须,我考虑使用另一个数据结构来存储数据帧(如字典)并执行计算


Tags: 数据方法projectvalue账户accountyearjan
2条回答

使用pivotstack

(df.pivot_table(index=['Year','Month', 'Project'],
               columns=['Account'], values='Value'
               )
   .assign(Cost=lambda x: x['Revenue']-x['Profit'])
   .stack().reset_index(name='Value')
)

输出:

   Year Month Project  Account  Value
0  2020   Jan     abc   Profit     10
1  2020   Jan     abc  Revenue    100
2  2020   Jan     abc     Cost     90
3  2020   Jan     xyz   Profit     20
4  2020   Jan     xyz  Revenue    350
5  2020   Jan     xyz     Cost    330

试试这个

grp = df.groupby(["Year",   "Month",   "Project",   "Account"]).agg({"Value":"sum"}).reset_index()
costdf = grp.groupby(["Year",   "Month",   "Project"]).apply(lambda x: (x[x["Account"]=="Revenue"]["Value"].values[0] - x[x["Account"]=="Profit"]["Value"].values[0])).reset_index()
costdf.columns = ["Year",   "Month",   "Project","Value"]
costdf["Account"] = "Cost"
costdf = costdf[df.columns]
df = pd.concat([df,costdf])

相关问题 更多 >