2017-07-18 51 views
1

我有一個包含說明列的數據框,我試圖從該列中的文本中解析出測量值。在數據框中創建新列時保留缺失值空白

df['measurements'] = [re.findall('\S+\scm', i) + re.findall('\S+cm', i) for i in df['description'] if i is not None] 
#... 

description列中的一些行是空的,所以上面的代碼給了我一個ValueError,因爲值的長度與索引的長度不匹配。如果該行爲空,那麼如何追加一個像NaN這樣的填充值,以便值的長度與索引的長度相匹配,並且可以創建新的度量值列?

輸出看起來類似於: 例如。

description      measurements 
blabla 32cm x 24cm x 12cm blabla ['32cm', '24cm', '12cm'] 
NaN        NaN 
18cm x 15cm x 10cm blablabla  ['18cm', '15cm', '10cm'] 
NaN        NaN 
+0

你可以添加一些樣本數據和期望的輸出? – jezrael

+0

我通過樣品數據更改輸出。 – jezrael

回答

2

我認爲你需要str.findall什麼用None作品完美的 - 它在輸出返回NaN

df['measurements'] = df['description'].str.findall('\S+\scm') + 
        df['description'].str.findall('\S+cm') 

如果需要更換None s到空列表simpliest是使用fillna

des = df['description'].fillna('') 
df['measurements'] = des.str.findall('\S+\scm') + des.str.findall('\S+cm') 

樣品:

df = pd.DataFrame({'description':['blabla 32cm x 24cm x 12cm blabla',np.nan, 
            '18cm x 15cm x 10cm blablabla',np.nan]}) 
print (df) 
         description 
0 blabla 32cm x 24cm x 12cm blabla 
1        NaN 
2  18cm x 15cm x 10cm blablabla 
3        NaN 

df['measurements'] = df['description'].str.findall('\S+\scm') + \ 
        df['description'].str.findall('\S+cm') 

print (df) 
         description  measurements 
0 blabla 32cm x 24cm x 12cm blabla [32cm, 24cm, 12cm] 
1        NaN     NaN 
2  18cm x 15cm x 10cm blablabla [18cm, 15cm, 10cm] 
3        NaN     NaN 

des = df['description'].fillna('') 
df['measurements'] = des.str.findall('\S+\scm') + des.str.findall('\S+cm') 
print (df) 
         description  measurements 
0 blabla 32cm x 24cm x 12cm blabla [32cm, 24cm, 12cm] 
1        NaN     [] 
2  18cm x 15cm x 10cm blablabla [18cm, 15cm, 10cm] 
3        NaN     [] 
+0

謝謝!完全忘記了在運行搜索之前你可能只是填充。我只是在使用dropna,但意識到丟棄的行可能在以後仍然有用。 – user7374610

+0

是的,我認爲如果以後需要過程數據,我會更好的使用'fillna'並獲得'[]'而不是'NaN's。 Becuae如果列中有標量列表('NaN's),某些函數可能會失敗。 – jezrael