首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从dataframe的列中减去一列

从dataframe的列中减去一列
EN

Stack Overflow用户
提问于 2017-03-17 16:35:11
回答 3查看 539关注 0票数 3

我有如下数据:

代码语言:javascript
复制
    name   tag      price
0   x1     tweak1   1.1 
1   x1     tweak2   1.2
2   x1     base     1.0
3   x2     tweak1   2.1
4   x2     tweak2   2.2
5   x2     base     2.0

我想从价格栏中减去基本价格,并创建一个新的列如下:

代码语言:javascript
复制
    name   tag      price  sensitivity
0   x1     tweak1   1.1    0.1
1   x1     tweak2   1.2    0.2
2   x1     base     1.0    0.0
3   x2     tweak1   1.3    -0.7
4   x2     tweak2   2.4    0.4
5   x2     base     2.0    0.0

并最终删除带有标记基的行以获得

代码语言:javascript
复制
    name   tag      price  sensitivity
0   x1     tweak1   1.1    0.1
1   x1     tweak2   1.2    0.2
3   x2     tweak1   1.3    -0.7
4   x2     tweak2   2.4    0.4

在熊猫身上做这个手术最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-17 16:55:44

你可以试试这个:

代码语言:javascript
复制
(df.groupby('name', group_keys=False)
 .apply(lambda g: g.assign(sensitivity = g.price - g.price[g.tag == "base"].values))
 [lambda x: x.tag != "base"])

或者另一种选择,即将表转换为宽格式,执行减法,然后将其转换回长格式:

代码语言:javascript
复制
wide_df = df.pivot_table(['price'], 'name', 'tag')   
(wide_df.sub(wide_df[('price', 'base')], axis=0)
 .drop(('price', 'base'), 1).stack(level=1)
 .reset_index())

票数 2
EN

Stack Overflow用户

发布于 2017-03-17 18:29:45

首先,我将从'name''tag'列中创建索引。

然后我会减去'base'横截面。熊猫会为我们排好队的。

最后,使用assign + drop + reset_index进行簿记和格式化。

代码语言:javascript
复制
p = df.set_index(['name', 'tag'])[['price']]

p.assign(sensitivity=p - p.xs('base', level=1)).drop('base', level=1).reset_index()

  name     tag  price  sensitivity
0   x1  tweak1    1.1          0.1
1   x1  tweak2    1.2          0.2
2   x2  tweak1    1.3         -0.7
3   x2  tweak2    2.4          0.4
票数 2
EN

Stack Overflow用户

发布于 2017-03-17 17:01:36

以下是我要处理的问题:

1)创建基列

2)减去这些栏

3)放下底座(没有双关语)

代码语言:javascript
复制
import pandas as pd
import numpy as np
# Creates a column 'Base' If 'Tag' is base and use the value from price
# if 'Tag' is not base, use 0
df['Base'] = np.where(df.tag.isin(['base']), df['Price'] ,0)
# takes the difference of the two columns
df['difference'] = df['Price'] - df['Base']
# Creates a new DF that uses all values except when 'Tag' is base
df3 = df[df['Tag'] !='Base'] 
print(df3)

下面是我以前提出的代码示例。如果你愿意的话,可以随心所欲:

代码语言:javascript
复制
import re
import pandas as pd
import numpy as np
df = pd.DataFrame({'A' : [1,1,3,4,5,5,3,1,5,np.NaN], 
                    'B' : [1,np.NaN,3,5,0,0,np.NaN,9,0,0], 
                    'C' : ['AA1233445','AA1233445', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
                    'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN],
                    'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]})
print(df)

df['Base'] = np.where(df.E.isin(['Assign']), df['A'] ,0)
df['difference'] = df['B'] - df['Base']
df3 = df[df['E'] !='Assign']

产出:

代码语言:javascript
复制
   A    B           C            D           E  Base  difference
1  1.0  NaN   AA1233445     123456.0    Unassign   0.0         NaN
3  4.0  5.0    Idaho Rx   12345678.0        Ugly   0.0         5.0
4  5.0  0.0    Ab123455      12345.0  Appreciate   0.0         0.0
5  5.0  0.0    TV192837      12345.0        Undo   0.0         0.0
7  1.0  9.0  Ohio Drugs  123456789.0    Unicycle   0.0         9.0
9  NaN  0.0  USA Pharma          NaN     Unicorn   0.0         0.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42862763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档