我有一个数据集df,如果这两个列都符合标准,我希望从某一列中减去一个特定的值。以及创建一个包含所减内容的新列。
数据
start id q1_avail q1_used
50 aa 10 40
20 bb 5 15
期望的
start id q1_avail q1_used delta
50 aa 8 40 2
20 bb 4 15 1
逻辑
我们正在寻找'q1_avail‘列以及id 'aa’。然后,我们从q1_avail列下的10中减去值2,值2是从10中减去的。10-8 =2
做
mask = df['q1_avail']
df.loc[mask, 'q1_avail] -= out['id'].map({'aa':2,
'bb':1,})
如有任何建议,将不胜感激。
发布于 2021-11-11 00:57:29
我将使用普通的.apply(function, axis=1)
分别在每一行上运行function
,这个function
可以使用if/else
检查id
中的值,更改q1_avail
并创建delta
。
最小工作实例
text = '''start id q1_avail q1_used
50 aa 10 40
20 bb 5 15'''
import pandas as pd
import io
df = pd.read_csv(io.StringIO(text), sep="\s+")
def function(row):
if row['id'] == 'aa':
row['q1_avail'] -=2
row['delta'] = 2
if row['id'] == 'bb':
row['q1_avail'] -=1
row['delta'] = 1
return row
df = df.apply(function, axis=1)
print(df)
结果:
start id q1_avail q1_used delta
0 50 aa 8 40 2
1 20 bb 4 15 1
您还可以创建更复杂的function
,甚至获取参数,但随后需要使用lambda
。
def function(row, maps):
row['delta'] = maps[row['id']]
row['q1_avail'] -= row['delta']
return row
df = df.apply(lambda row:function(row, {'aa':2, 'bb':1}), axis=1)
编辑:
用你的最后一段代码它可能是
df['delta'] = df['id'].map({'aa': 2, 'bb':1})
df['q1_avail'] = df['q1_avail'] - df['delta']
#df['q1_avail'] -= df['delta']
https://stackoverflow.com/questions/69921232
复制相似问题