基于来自两个不同列Python Pandas

时间:2017-04-13 18:35:05

标签: python string pandas

我有2列,我需要从每列中获取特定的字符串信息,并基于此创建一个包含新字符串的新列。

在列"名称" 中我有好名字,我需要查看每个wellname的最后4个字符,如果包含&#34 ; H"然后打电话给" HZ"在一个新栏目中。

如果列" WELLTYPE"我需要做同样的事情。包含特定字词。

使用数据分析程序Spotfire我可以在一个简单的等式中完成所有这些操作。 (见下文)。

case  
When right([UWI],4)~="H" Then "HZ" 
When [WELLTYPE]~="Horizontal" Then "HZ" 
When [WELLTYPE]~="Deviated" Then "D" 
When [WELLTYPE]~="Multilateral" Then "ML"
else "V"
End

在Python Pandas中执行此操作的最佳方法是什么?

是否有一种简单干净的方式可以像上面的点火等一样一次完成这一切?

这是带有两列的数据表和我有希望的结果列。 (它没有很好地复制到这里),我也提供了下表的代码。

    Name    WELLTYPE    What I Want
0   HH-001HST2  Oil Horizontal  HZ
1   HH-001HST   Oil_Horizontal  HZ
2   HB-002H Oil HZ
3   HB-002  Water_Deviated  D
4   HB-002  Oil_Multilateral    ML
5   HB-004  Oil V
6   HB-005  Source  V
7   BB-007  Water   V

以下是创建数据框的代码

# Dataframe with hopeful outcome
raw_data = {'Name': ['HH-001HST2', 'HH-001HST', 'HB-002H', 'HB-002', 'HB-002','HB-004','HB-005','BB-007'],
            'WELLTYPE':['Oil Horizontal', 'Oil_Horizontal', 'Oil', 'Water_Deviated', 'Oil_Multilateral','Oil','Source','Water'],
           'What I Want': ['HZ', 'HZ', 'HZ', 'D', 'ML','V','V','V']}
df = pd.DataFrame(raw_data, columns = ['Name','WELLTYPE','What I Want'])
df

3 个答案:

答案 0 :(得分:2)

嵌套'其中'变体:

df['What I Want'] = np.where(df.Name.str[-4:].str.contains('H'), 'HZ',
                       np.where(df.WELLTYPE.str.contains('Horizontal'),'HZ',
                       np.where(df.WELLTYPE.str.contains('Deviated'),'D',
                       np.where(df.WELLTYPE.str.contains('Multilateral'),'ML',
                       'V'))))

答案 1 :(得分:1)

这对我来说更自然。显然是主观的

from_name = df.Name.str[-4:].str.contains('H').map({True: 'HZ'})

regex = '(Horizontal|Deviated|Multilateral)'
m = dict(Horizontal='HZ', Deviated='D', Multilateral='ML')
from_well = df.WELLTYPE.str.extract(regex, expand=False).map(m)

df['What I Want'] = from_name.fillna(from_well).fillna('V')

print(df)

         Name          WELLTYPE What I Want
0  HH-001HST2    Oil Horizontal          HZ
1   HH-001HST    Oil_Horizontal          HZ
2     HB-002H            Oil HZ          HZ
3      HB-002    Water_Deviated           D
4      HB-002  Oil_Multilateral          ML
5      HB-004             Oil V           V
6      HB-005            Source           V
7      BB-007             Water           V

答案 2 :(得分:0)

使用按行申请:

def criteria(row):
    if row.Name[-4:].find('H') > 0:
        return 'HZ'
    elif row.WELLTYPE.find('Horizontal') > 0:
        return 'HZ'
    elif row.WELLTYPE.find('Deviated') > 0:
        return 'D'
    elif row.WELLTYPE.find('Multilateral') > 0:
        return 'ML'
    else:
        return 'V'

df['want'] = df.apply(criteria, axis=1)