如何"扩展"来自字符串/字符的pandas数据框?

时间:2016-11-07 18:26:07

标签: python python-3.x pandas

我从列表列表中生成了一个pandas数据框:

在:

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

当我创建一个pandas数据帧时,我试图这样做:

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

我也试过:

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

但是,我没有匹配所有元素。是否可以使用pandas获得(*)格式?。

1 个答案:

答案 0 :(得分: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函数接收DataFrame的每一行作为pandas Series,然后使用此系列的第一个也是唯一的元素中的字符串(r[0])。然后,该字符串由'\n'字符分割,因此每个数据字段都是列表的单独元素,并且':'字符再次将标签与实际数据分开。最后,数据被重新组合成另一个pd.Series并返回。 .apply() DataFrame方法只是将上面的函数应用于帧的每一行。

此函数也可以修改为在加载到DataFrame之前解析列表。