熊猫以if条件进行切片

时间:2019-06-19 19:25:58

标签: python pandas

我试图基于简单的逻辑创建一列,但是它不起作用。 我想用一个简单的逻辑创建一个名为“商品”的新列:

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(如果)并应用方法,但一直收到错误消息。

4 个答案:

答案 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], '')