2017-06-17 64 views
1

我想的if-else循環像這樣的蟒蛇熊貓匹配一個正則表達式:匹配在python大熊貓正則表達式元組

df=pd.read('XYZ.csv'); 
Total_Data=df['Description'].str.extract(r'([0-9]+(\.[0-9][0-9]?)?\sGB|[0-9]+(\.[0-9][0-9]?)?\s?MB)')[0]; 
df['Total_Data']=Total_Data.str.extract(r'([0-9]{1,4})') 

for row in Total_Data.iteritems() : 
print (type(row)) 
if row.str.contains(r'((?i)MB)'): 
df['Total_Data']=df['Total_Data']/1000; 

現在我知道什麼是錯在這裏是在pandas.But系列那麼我應該如何遍歷Total_Data中的行,以便如果MB字在Total_Data中,我可以將其轉換爲GB.I要檢查此寄存器並將這些MB元組數據轉換爲GB 編輯:

我的數據的子集:

09  NaN 
10  NaN 
11  NaN 
12  NaN 
13  300 MB 
14  NaN 
15  NaN 
16  NaN 
17  80 MB 
18  125 MB 
19  200 MB 
20   1 GB 
21  250 MB 
22  400 MB 
23  350 MB 
24   2 GB 
25  500 MB 
26   1 GB 
27   1 GB 
+0

你可以共享一個頭或數據的一小部分?一般來說它應該很簡單,但我想在發佈答案之前進行測試。而且沒有理由使用if和iteritems來處理大熊貓,你可以用apply來完成它。 – omdv

回答

0

的Regex版

首先定義要應用的功能,然後應用。如果您希望明顯改變輸出,請更改函數的返回值。

df = pd.DataFrame() 
df['Total_Data'] = [np.nan, np.nan, '300MB', '200 MB', '1 GB'] 

def process_row(row): 
    match = re.match('^(\d+)\s*(MB)',str(row)) 
    if match: 
     return str(int(match.group(1))/1000) + " GB" 
    else: 
     return row 

df['Total_Data'] = df['Total_Data'].apply(process_row) 

    Total_Data 
0  NaN 
1  NaN 
2  0.3 GB 
3  0.2 GB 
4  1 GB 

'熊貓' 版

這其中做了一些更改數據框。

首先讓我們用空字符串替換NaN來簡化生活。

df['Total_Data'].fillna('0 None', inplace=True) 

然後拆分一列,因爲它看起來像有一個空格分隔的值。

foo = lambda x: pd.Series([i for i in x.split(' ')]) 
df[['value', 'unit']] = df['Total Data'].apply(foo) 
df['value'] = df['value'].astype('int') 

你喜歡的東西:

Total Data value unit 
0 0 None  0 None 
1 0 None  0 None 
2 80 MB  80 MB 
3 200 MB 200 MB 
4 2 GB  2 GB 
5 1 GB  1 GB 

剩下的就是簡單。獲取條目的索引以相應地更改和更新它們。

idx = df.loc[df['unit'] == 'MB'].index 
df.loc[idx, 'value'] = df['value']/1000 
df.loc[idx, 'unit'] = 'GB' 
+0

其實我已經報廢了數據。有時在200MB之間沒有空間。我必須使用正則表達式。是否有其他方式通過正則表達式通過我可以實現這個因爲我需要這個別的地方也 –

+0

好吧,讓我更新它。 – omdv

+0

謝謝你解決了我的問題 –

0

請嘗試以下,看看它是否有效,

if (r'((?i)MB)') in row.str: 
    df['Total_Data']=df['Total_Data']/1000; 

我嘗試「在」使用的小程序,它的工作。因此,建議如果你。

df="200MB" 
if "200" in df: 
    print "Yes" 
Yes 
+0

不,它不起作用。 –

0
dtypes = {0:float, 1:object} 
cnames = {0:'value', 1:'unit'} 
replce = dict(unit=dict(MB=.001, GB=1.)) 
fmt = lambda x: np.nan if pd.isnull(x) else '{:0.3f} GB'.format(x) 

df.Total_Data.str.split(expand=True) \ 
    .astype(dtypes).rename(columns=cnames) \ 
    .replace(replce).prod(1).apply(fmt) 

0 
9   NaN 
10   NaN 
11   NaN 
12   NaN 
13 0.300 GB 
14   NaN 
15   NaN 
16   NaN 
17 0.080 GB 
18 0.125 GB 
19 0.200 GB 
20 1.000 GB 
21 0.250 GB 
22 0.400 GB 
23 0.350 GB 
24 2.000 GB 
25 0.500 GB 
26 1.000 GB 
27 1.000 GB 
dtype: object