【问题标题】:Substracting values from two different pandas dataframes based on same row values根据相同的行值从两个不同的熊猫数据帧中减去值
【发布时间】:2021-09-23 17:06:27
【问题描述】:

我有两个数据框的数据 第一个数据框:

Name    price  date
Apple    25   23-9-2021
Orange   35   23-9-2021
Banana   15   23-9-2021
Gauva    10   23-9-2021
Grapes   5    23-9-2021
Sapota   15   22-9-2021
Papaya   33   21-9-2021
Apple    20   23-9-2021
Orange   30   23-9-2021
Banana   10   23-9-2021
Gauva    10   23-9-2021
Grapes   5    23-9-2021
Apple    15   23-9-2021
Orange   25   23-9-2021
Banana   25   23-9-2021
Gauva    20   23-9-2021
Grapes   15    23-9-2021

第二个数据框:

Name   price   date
Apple   80     23-9-2021
Orange  100     23-9-2021
Banana  90     23-9-2021
Gauva   60     23-9-2021
Grapes  45     23-9-2021

在第一个数据框中,将相同水果名称的所有价格值相加并进行减法,即 我想根据相同名称和日期的行值减去两个数据帧的价格值并将其存储到第一个数据帧中

输出:第一个数据帧

Name   price   date
Apple   25     23-9-2021
Orange  35     23-9-2021
Banana  15     23-9-2021
Gauva   10     23-9-2021
Grapes  5      23-9-2021
Sapota  15     22-9-2021
Papaya  33     21-9-2021
Apple    20   23-9-2021
Orange   30   23-9-2021
Banana   10   23-9-2021
Gauva    10   23-9-2021
Grapes   5    23-9-2021
Apple    15   23-9-2021
Orange   25   23-9-2021
Banana   25   23-9-2021
Gauva    20   23-9-2021
Grapes   15    23-9-2021
Apple   20     23-9-2021
Orange  10     23-9-2021
Banana  40     23-9-2021
Gauva   20     23-9-2021
Grapes  15     23-9-2021

我有一百多个这样的水果名称。 我不知道该怎么做

【问题讨论】:

  • 请注意,拼写为“guava”
  • 输出数据框的最后一行是假的。葡萄应该是 20。
  • 是的,你是对的

标签: python pandas dataframe


【解决方案1】:
  1. merge 两个数据框
  2. 找出价格差异
  3. concat
df3 = df2.merge(df1, how="left", on=["Name", "date"])
df3["price"] = df3["price_x"]-df3["price_y"]

output = pd.concat([df1, df3.drop(["price_x", "price_y"], axis=1)])

>>> output
     Name  price       date
0   Apple     25  23-9-2021
1  Orange     35  23-9-2021
2  Banana     15  23-9-2021
3   Gauva     10  23-9-2021
4  Grapes      5  23-9-2021
5  Sapota     15  22-9-2021
6  Papaya     33  21-9-2021
0   Apple      5  23-9-2021
1  Orange     10  23-9-2021
2  Banana     15  23-9-2021
3   Gauva     10  23-9-2021
4  Grapes     20  23-9-2021

【讨论】:

  • 我运行此代码是因为我对 date 列感到困惑,结果发现您的输出与代码输出的内容不匹配(也与 OP 的预期结果不匹配)所以我已编辑。
  • 只是日期格式。不会真正影响代码逻辑
  • 不,不是格式——你所有的日期都是23-9-2021,但一些OP的实际日期有21-22-。您的输出也正确拼写了番​​石榴,而 OP 有一个错字。
  • 作为提示,OP 的 DataFrames 实际上是可以复制粘贴的,使用 pd.read_clipboard()。这样您就不必手动构造 DataFrame,这似乎就是这里发生的事情:D
【解决方案2】:

您可以使用set_index 代替merge

out = pd.concat([df1, df2.set_index(['Name', 'date'])['price']
                         .sub(df1.groupby(['Name', 'date'])['price'].sum())
                         .dropna().reset_index()], ignore_index=True)

输出:

>>> out

      Name  price       date
0    Apple   25.0  23-9-2021
1   Orange   35.0  23-9-2021
2   Banana   15.0  23-9-2021
3    Gauva   10.0  23-9-2021
4   Grapes    5.0  23-9-2021
5   Sapota   15.0  22-9-2021
6   Papaya   33.0  21-9-2021
7    Apple   20.0  23-9-2021
8   Orange   30.0  23-9-2021
9   Banana   10.0  23-9-2021
10   Gauva   10.0  23-9-2021
11  Grapes    5.0  23-9-2021
12   Apple   15.0  23-9-2021
13  Orange   25.0  23-9-2021
14  Banana   25.0  23-9-2021
15   Gauva   20.0  23-9-2021
16  Grapes   15.0  23-9-2021
17   Apple   20.0  23-9-2021
18  Banana   40.0  23-9-2021
19   Gauva   20.0  23-9-2021
20  Grapes   20.0  23-9-2021
21  Orange   10.0  23-9-2021

【讨论】:

  • 编辑了我的问题,请仔细阅读,很抱歉编辑我的问题和迟到的回复。请根据编辑的问题修改代码。
  • @KrishnaPrasad。我更新了我的答案。
  • 减法后没有得到正确的值。
  • 如果我在两个数据框中有两列或多列,例如温度和日。那么如何在输出中打印那些列
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2021-06-27
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多