一列拆分为多行
如下代码所示,该数据框中最后两列的部分数据为逗号分隔开的多个值。目前希望将数据框中的数据分割成为单条数据一行的格式。
1 | name color size |
想要得到的数据框格式如下:
1 | name color size |
实现思路:对于color和size列按照逗号对各个值进行拆分,将单个值转化为一行,同时相应的name列增加相应行。
在其中数据的拆分在pandas里有stack()
函数可以完成该功能。该函数的完整文档和范例代码可见这里。
由于矩阵经过拆分后行数增多,其索引也会发生变化,需要使用reset_index()
函数对新数据框的索引进行重设。reset_index()
的相关文档可见这里。
以下为实现代码:
1 | import pandas as pd |
lambda结合apply对数据框的特定元素进行处理
lambda是python中的匿名函数,即没有具体名称的函数。它允许快速定义单行函数,可以用在任何需要函数的地方。因此,这类函数一般用于定义少次使用且功能较简单的功能(因为lambda表达式后只可以跟一个表达式,限制了函数的复杂性)。
其语法为:lambda 参数:操作(参数)
关于lambda使用可以参考以下例子:
1 | map( lambda x: x^2, [y for y in range(10)] ) |
以上的例子表示对于一个序列中的所有元素都平方。其中这里的map()可以将lambda所定义的表达式映射到list中的每个元素。同理,可以考虑将lambda所定义的表达式应用于数据框的某列元素或所有元素。
在pandas中,实现此功能的函数为apply
该函数的语法为:
1 | DataFrame.apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)[source] |
其中,func
表示要执行的函数,axis
表示数据传入方式,axis=0
表示逐行传入数据,而axis=1
表示逐列传入数据。
最终,所有结果会以series数据结构返回。以上面的数据框为例,以下为将name等于AAAA的替换为全小写字符’’:
1 | df['name'] = df4['name'].apply(lambda x: lower(x) if x=='AAAA' else x) |
数据框的拼接方法
pandas中提供的数据框拼接方法有:concat, append, join及merge四种,它们的特点和区别可见下表:
方法 | 特性 |
---|---|
concat | 可以使数据框间行方向或列方向进行外联或内联拼接 |
append | 数据框行方向拼接 |
join | 数据框列方向拼接,支持左联、右联、内联和外联四种操作 |
merge | 类似SQL数据库的联表操作,支持左、右、内、外联四种操作 |
pd.concat()
1 | concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, |
部分用法示例:
1 | df1 |
df.append()
1 | append(self, other, ignore_index=False, verify_integrity=False) |
部分用法示例:
1 | # 以上面的df1和df2为例,使用append方法 |
df.join()
1 | join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False) |
部分用法示例:
1 | df3 |
df.merge()
1 | pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, |
部分用法示例:
1 | # 使用上述df1及df2作为数据框例子 |
参考资料:
1.python – pandas:如何将一列中的文本拆分为多行?
2.Pandas中的拼接操作(concat,append,join,merge)