我从列表列表中生成了一个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获得(*)格式?。
答案 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之前解析列表。