如果第二列中的文本包含特定的字符串模式,那么如何创建新列?

时间:2020-01-16 15:57:11

标签: python regex pandas dataframe conditional-statements

我当前的数据看起来像这样

lng

我正在尝试创建一个新列+-------+----------------------------+-------------------+-----------------------+ | Index | 0 | 1 | 2 | +-------+----------------------------+-------------------+-----------------------+ | 0 | Reference Curr | Daybook / Voucher | Invoice Date Due Date | | 1 | V50011 Tech Comp | nan | Phone:0177222222 | | 2 | Regis Place | nan | Fax:017757575789 | | 3 | Catenberry | nan | nan | | 4 | Manhattan, NY | nan | nan | | 5 | V7484 Pipe | nan | Phone: | | 6 | Japan | nan | nan | | 7 | nan | nan | nan | | 8 | 4543.34GBP (British Pound) | nan | nan | +-------+----------------------------+-------------------+-----------------------+ ,如果它以“ V”开头并且df['Company']中包含“ Phone”,则该列应包含df[0]中的内容它。如果不满足条件,则可以为df[2]。以下是我要寻找的东西。

nan

我正在尝试下面的脚本,但是出现错误+-------+----------------------------+-------------------+-----------------------+------------+ | Index | 0 | 1 | 2 | Company | +-------+----------------------------+-------------------+-----------------------+------------+ | 0 | Reference Curr | Daybook / Voucher | Invoice Date Due Date | nan | | 1 | V50011 Tech | nan | Phone:0177222222 |V50011 Tech | | 2 | Regis Place | nan | Fax:017757575789 | nan | | 3 | Catenberry | nan | nan | nan | | 4 | Manhattan, NY | nan | nan | nan | | 5 | V7484 Pipe | nan | Phone: | V7484 Pipe | | 6 | Japan | nan | nan | nan | | 7 | nan | nan | nan | nan | | 8 | 4543.34GBP (British Pound) | nan | nan | nan | +-------+----------------------------+-------------------+-----------------------+------------+ ,位置暗示1

ValueError: Wrong number of items passed 1420

我把“ stop”作为其他部分,因为不满足条件时我不知道如何让python使用df['Company'] = pd.np.where(df[2].str.contains("Ph"), df[0].str.extract(r"(^V[A-Za-z0-9]+)"),"stop")

我还希望能够解析出df [0]的一部分,例如v5001部分,而不解析其余单元格内容。我使用AMC答案尝试过类似的操作,但出现错误:

nan

谢谢

2 个答案:

答案 0 :(得分:1)

这是获得结果的另一种方法

condition1=df['0'].str.startswith('V')
condition2=df['2'].str.contains('Phone')

df['Company']=np.where((condition1 & condition2), df['0'],np.nan)
df['Company']=df['Company'].str.split(' ',expand=True)

答案 1 :(得分:0)

IIUC,

我们可以使用布尔条件来提取带有基本正则表达式的V号,

或者我们可以在where语句中应用相同的公式。

要将值设置为NaN,我们可以使用np.nan

如果您想在V之后抓取整个字符串,可以使用[V]\w+.*,它将在第一个匹配项之后抓取所有内容。

from IO import StringIO

 d = """+-------+----------------------------+-------------------+-----------------------+
| Index |             0              |         1         |           2           |
+-------+----------------------------+-------------------+-----------------------+
|     0 | Reference Curr             | Daybook / Voucher | Invoice Date Due Date |
|     1 | V50011 Tech Comp           | nan               | Phone:0177222222      |
|     2 | Regis Place                | nan               | Fax:017757575789      |
|     3 | Catenberry                 | nan               | nan                   |
|     4 | Manhattan, NY              | nan               | nan                   |
|     5 | Ultilagro, CT              | nan               | nan                   |
|     6 | Japan                      | nan               | nan                   |
|     7 | nan                        | nan               | nan                   |
|     8 | 4543.34GBP (British Pound) | nan               | nan                   |
+-------+----------------------------+-------------------+-----------------------+"""

df = pd.read_csv(StringIO(d),sep='|',skiprows=1)
df = df.iloc[1:-1,2:-1]
df.columns = df.columns.str.strip()

df["3"] = df[df["2"].str.contains("phone", case=False) == True]["0"].str.extract(
    r"([V]\w+)"
)

print(df[['0','2','3']])
                           0                      2       3
1              Reference Curr  Invoice Date Due Date     nan
2            V50011 Tech Comp       Phone:0177222222  V50011
3                 Regis Place       Fax:017757575789     nan
4                  Catenberry                    nan     nan
5               Manhattan, NY                    nan     nan
6               Ultilagro, CT                    nan     nan
7                       Japan                    nan     nan
8                         nan                    nan     nan
9  4543.34GBP (British Pound)                    nan     nan

如果要用作where语句:

import numpy as np



df["3"] = np.where(
    df[df["2"].str.contains("phone", case=False)], df["0"].str.extract(r"([V]\w+)"), np.nan
)
            print(df[['0','2','3']])
                                   0                      2       3
        1              Reference Curr  Invoice Date Due Date     NaN
        2            V50011 Tech Comp       Phone:0177222222  V50011
        3                 Regis Place       Fax:017757575789     NaN
        4                  Catenberry                    nan     NaN
        5               Manhattan, NY                    nan     NaN
        6               Ultilagro, CT                    nan     NaN
        7                       Japan                    nan     NaN
        8                         nan                    nan     NaN
        9  4543.34GBP (British Pound)                    nan     NaN