正则表达式从pandas数据帧中过滤所需的行

时间:2015-10-16 12:28:11

标签: python regex pandas filter

我正在处理相当混乱的数据:具有以下形式的关税表:

import pandas as pd
import numpy as np

data1 = np.array([u'Free (A, B, KR, FR), 5% (JP)', u'Free (A, B, FR), 5% (JP, KR))'])
data2 = np.array(['10101010', '10101020'])
data = {'hscode': data2, 'tariff' : data1}

df = pd.DataFrame(data, columns=['hscode', 'tariff'])

第一行显示国家(A,B,KR,FR)的关税为零,JP为5%,第二行显示A,B,FR为0,JP为5%。 KR。

我想找到国家/地区的关税税率' KR'对于每一行,以便我可以使用下表:

' HSCODE' '关税'

10101010 0%

10101020 5%

所以,我想找到县代码的关税税率' KR'在每个细胞中。

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式申请:

## -- End pasted text --

In [133]: import re

In [134]: df
Out[134]: 
     hscode                         tariff
0  10101010   Free (A, B, KR, FR), 5% (JP)
1  10101020  Free (A, B, FR), 5% (JP, KR))

In [135]: df['tariff'].apply(lambda x: ''.join(re.findall(r'.*(Free|\d+%).*\bKR\b', x)))
Out[135]: 
0    Free
1      5%
Name: tariff, dtype: object

解释:在关税范围内,捕获" Free"或" x%"如果字符串包含" KR"。

您可以创建一个动态设置" KR"作为查找变量。

答案 1 :(得分:0)

    import pandas as pd
    import numpy as np

    data1 = np.array([u'Free (A, B, KR, FR), 5% (JP)', u'Free (A, B, FR), 5% (JP, KR))'])
    data2 = np.array(['10101010', '10101020'])

    df = []
    for i, element in enumerate(data1):
        free, five = element.lstrip('Free (').rstrip(')').split('), 5% (')
        for country in free.split(', '):
            row = [data2[i], 'Free', country]
            df.append(row)
        for country in five.split(', '):
            row = [data2[i], '5%', country]
            df.append(row)
    df = pd.DataFrame(df, columns = ['hscode', 'tariff', 'country'])
    print df.query('country == "KR"')

给出

     hscode tariff country
2  10101010   Free      KR
9  10101020     5%      KR
相关问题