2016-11-07 57 views
2

我產生了大熊貓數據幀從一個列表的列表:如何從字符串/字符「展開」一個熊貓數據框?

在:

lis = [['baby ferrets\ntype: mamal\n»age:2\n»food: Renal'],['dog\ntype: mamal\n»age: 3 months\n»food: dog food'], ['cat\ntype: mamal\n»age: 2\n»food: cat food'], ['bobcat (exotic pet)\ntype: mamal\n»age: 1\n»food: meat'], ['iguana\ntype: reptile\n»age: 2\n»food: crickets']] 

df = pd.DataFrame(lis) 
df 

日期:

0 
0 baby ferrets\ntype: mamal\n»age:2\n»food: Renal 
1 dog\ntype: mamal\n»age: 3 months\n»food: dog food 
2 cat\ntype: mamal\n»age: 2\n»food: cat food 
3 bobcat (exotic pet)\ntype: mamal\n»age: 1\n»food: meat 
4 iguana\ntype: reptile\n»age: 2\n»food: crickets 

我怎樣才能改變以前的數據框入(*):

pet, type, age, food 
0 baby ferrets, mammal, 2, Renal 
1 dog, mammal, 3 months, dog food 
2 cat, mammal, 2, cat food 
3 bobcat (exotic pet), mammal, 1, meat 
4 iguana, reptile, 2, crickets 

當我創建一個熊貓數據框我嘗試去做:

df = pd.DataFrame(lis, sep= '\n') 

我也試過:

df['newcol'] = lis['pet'].str.extract('([A-Z]\w{0,})', expand=True) 
df 

不過,我不匹配的所有元素。是否有可能用熊貓獲得(*)格式?

回答

2

這應該適用於解析加載後的列。

def parse_col(r): 
    return pd.Series(data=[i.split(':')[-1] for i in r[0].split('\n')], index=['name', 'type', 'age', 'food']) 

df.apply(parse_col, axis=1) 

    name type age food 
0 baby ferrets mamal 2 Renal 
1 dog mamal 3 months dog food 
2 cat mamal 2 cat food 
3 bobcat (exotic pet) mamal 1 meat 
4 iguana reptile 2 crickets 

說明:

parse_col函數上述正在接收數據幀中的每一行作爲熊貓Series,然後使用在本系列(r[0])的第一個和唯一的元素的字符串。該字符串然後被'\n'字符分割,因此每個數據字段是列表的單獨元素,並且再次由':'字符將標籤與實際數據分隔開。最後,數據被重新組裝成另一個pd.Series並返回。 DataFrame方法只是將上面的函數應用於幀的每一行。

此函數也可以修改爲在加載到DataFrame之前解析列表。

+0

謝謝jonnat能否提供解釋? – student

+0

@student,當然,加了一些解釋 – foglerit