2015-10-16 61 views
4

我正在與相當雜亂數據工作需要的行:具有以下形式的資費表:正則表達式過濾從熊貓數據幀

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爲零,JP和KR爲5%。

我想找到全國KR「每一行的稅率,這樣我就可以有如下表:

'HSCODE '關稅'

10101010 0%

10101020 5%

因此,我想在每個單元中找到縣代碼'KR'的關稅稅率。

+0

您能否更清楚地解釋data2與data1相關的數據以及與KR和(A,B,KR,FR)的關係? – Anzel

+0

嗨Anzel,data2是「hamonized關稅代碼」,data1顯示了每個國家的實際關稅稅率。 (A,B,KR,FR,JP)都表示countires,我想找到特定國家的關稅稅率KR。謝謝。 –

+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 

解釋:關稅範圍內,捕捉無論是 「自由」 或 「x%」,如果字符串包含 「KR」 。

您可以創建一個函數將「KR」動態設置爲查找變量。

+0

Anzel,你是我的天使!這工作得很好,但我仍然需要學習正則表達式。我不明白這個代碼是如何工作的。它看起來像試圖在x中找到(Free | \ d +%),但我不知道這個表達式中的兩個星號(*)和一個圓點(。)是做什麼的。我也不知道這段代碼如何處理括號。但非常感謝!我會更多地學習這個! –

+0

@JohnShin沒問題:)。*(點星號)表示任意字符中的零個或多個字符(這是真正的任何字符)和\ b [string] \ b意味着整個事物必須包含完整的[字符串],接受它作爲開始 - endswith – Anzel

+0

@JohnShin我使用的正則表達式基本上是一個模式匹配說OK - 有或沒有任何前面。*沒有括號(我沒有捕獲它),它必須是「自由」或「x% 「括號(我想捕獲值),再次,它必須包含的字符串之間可以有任何東西,即。 「KR」......所以最後你只捕獲(...)< - 括號內的東西 – Anzel

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 
+0

感謝您的回答。但是,如果有多個關稅稅率,即如果可能是4%,5%,1%等......我有超過2萬個行。謝謝。 –