訣竅是先提取車柱,然後讓製造商。
import pandas as pd
import numpy as np
df['model'] = df['T'].apply(lambda x: x.split(
'(')[0].strip() if x.count('(') > 0 else np.NaN)
df['maker'] = df['T'].apply(lambda x: x.split('[')[0].strip(
) if x.count('[') > 0 else np.NaN).fillna(method="ffill")
df = df.dropna().drop('T', axis=1).reindex(
columns=['maker', 'model']).reset_index(drop=True)
代碼的第一行用分裂和帶字符串操作如果條目包含'('
提取所有的車,它分配NaN
否則,我們使用NaN
,使我們可以找到生產商後,刪除這些行。 在這個階段,數據幀df
將是:
+----+-----------------------+------------+
| | T | model |
|----+-----------------------+------------|
| 0 | Honda [edit] | nan |
| 1 | Accord (4 models) | Accord |
| 2 | Civic (4 models) | Civic |
| 3 | Pilot (3 models) | Pilot |
| 4 | Toyota [edit] | nan |
| 5 | Prius (4 models) | Prius |
| 6 | Highlander (3 models) | Highlander |
| 7 | Ford [edit] | nan |
| 8 | Explorer (2 models) | Explorer |
+----+-----------------------+------------+
第二行則相同,但爲'['
記錄,這裏的NaNs
被用來填補了利用fillna 空壺細胞在這個階段,數據幀df
將是:
+----+-----------------------+------------+---------+
| | T | model | maker |
|----+-----------------------+------------+---------|
| 0 | Honda [edit] | nan | Honda |
| 1 | Accord (4 models) | Accord | Honda |
| 2 | Civic (4 models) | Civic | Honda |
| 3 | Pilot (3 models) | Pilot | Honda |
| 4 | Toyota [edit] | nan | Toyota |
| 5 | Prius (4 models) | Prius | Toyota |
| 6 | Highlander (3 models) | Highlander | Toyota |
| 7 | Ford [edit] | nan | Ford |
| 8 | Explorer (2 models) | Explorer | Ford |
+----+-----------------------+------------+---------+
第三行丟棄多餘的記錄和重新排列列以及重置索引
| | maker | model |
|----+---------+------------|
| 0 | Honda | Accord |
| 1 | Honda | Civic |
| 2 | Honda | Pilot |
| 3 | Toyota | Prius |
| 4 | Toyota | Highlander |
| 5 | Ford | Explorer |
編輯:
更 「pandorable」 版本(我喜歡一個襯墊)
df = df['T'].str.extractall('(.+)\[|(.+)\(').apply(
lambda x: x.ffill()
if x.name==0
else x).dropna(subset=[1]).reset_index(
drop=True).rename(columns={1:'Model',0:'Maker'})
上述作品如下 extractall
會返回一個數據幀有兩列;列0
對應於使用第一組'(.+)\['
提取的正則表達式中的組,即製造商記錄以;和列1
,對應於第二組,即'(.+)\('
,apply
被用於遍歷列,名爲0
的列將被修改以通過ffill
向前傳播'製造商'值並且列1
將保持不變。 dropna
然後與子集1
一起使用以刪除列1
中的值爲NaN
,reset_index
用於刪除多指數extractall
生成的所有行。 (FUNC))
df['T'].apply(lambda line: [line.split('[')[0],None] if line.count('[')
else [None,line.split('(')[0].strip()]
).apply(pd.Series
).rename(
columns={0:'Maker',1:'Model'}
).apply(
lambda col: col.ffill() if col.name == 'Maker'
else col).dropna(
subset=['Model']
).reset_index(drop=True)
你能告訴我們你已經試過什麼最後的列使用
rename
和對應表另外一個襯墊改名?把代碼放在問題中。 – Lucas