我试图基于简单的逻辑创建一列,但是它不起作用。 我想用一个简单的逻辑创建一个名为“商品”的新列:
if df['ID'].str[:3] = 'FWD':
df['Commodity'] = df['ID'].str[3:6]
我的DF看起来像这样:
df = pd.DataFrame({'ID':['FWDUSD921','FWDNZD344','EUR'], 'Volumes': [10,20,33]})
如果没有匹配项,请将空格留空(或放0-没关系)
我尝试了lambdas(如果)并应用方法,但一直收到错误消息。
答案 0 :(得分:3)
在此处使用正则表达式
df.assign(Commodity=df.ID.str.extract(r'^FWD(\w{3})'))
ID Volumes Commodity
0 FWDUSD921 10 USD
1 FWDNZD344 20 NZD
2 EUR 33 NaN
正则表达式说明
^ # asserts position at start of line
FWD # matches FWD exactly
( # matching group 1
\w{3} # match 3 characters that match a-zA-Z0-9_
) # end of matching group
如果对“货币字符串”的定义还有其他要求(也许只有字母?),则可以用该要求替换\w
。
答案 1 :(得分:1)
只需根据您的条件创建一个遮罩,然后将其与.loc[]
mask = df['ID'].str[:3] == 'FWD'
df.loc[mask, 'Commodity'] = df.loc[mask, 'ID'].str[3:6]
答案 2 :(得分:0)
尝试:
s = df['ID'].str[:3].eq('FWD')
df.loc[s, 'Commodity'] = df['ID'].str[3:6]
输出:
ID Volumes Commodity
0 FWDUSD921 10 USD
1 FWDNZD344 20 NZD
2 EUR 33 NaN
答案 3 :(得分:0)
这应该可以解决问题:
import numpy as np
df['Currency'] = np.where(df['ID'].str[:3]=='FWD', df['ID'].str[3:6], '')