前言
在数据处理中,源数据可能具有一定便于记录但又复杂的结构,我们在后续使用数据时还需要进一步进行处理。在本例中,要根据一列数据提取出数据中的相关特征,我们来看看 pandas 是如何完成的。
需求:
- 以上数据的 a
列是包含复杂信息的字符串类型列。每个值由连字符连接信息,每个信息由数字和字母组成,数字代表此字母的数量,有些行可能包含多个相同字母。 - 现在的需求是在数据后边增加一些列,每个字母为一列,值为本行对应字母的数量。
- 如,索引 0 行,增加 R、A、G 三列,值分别是 13(有两个 R,前边的数字需要相加)、5、4。
二、使用步骤
1.引入库
代码如下(示例):
import pandas as pd
2.读入数据
代码如下(示例):
df = pd.DataFrame({'a': ['6R-5A-4G-7R','2A-4G-3A','8G','1R-9A']})
df
# 我们先以索引 0 行的 a 列数据为测试字符串编写处理函数。
# 用连字符拆分为列表
val = '6R-5A-4G-7R'.split('-')
val
# 将每个字母与前边的字母相乘,得到纯字母
val = [(i[-1])*int(i[:-1]) for i in val]
val
# 将列表所有元素连接为一个字符串
val = ''.join(val)
val
# 构造 Counter 对象
from collections import Counter
val = Counter(val)
val
# 以上构造的 Counter 对象,它可以帮助我们计算字符串(可迭代对象)里元素的个数,形成一个我们想要字典形式。它是字典的一个子类:
isinstance(val, dict)
Counter.mro()
# 接下来,将以上处理过程封装为一个函数:
from collections import Counterdef func(val: str):val = val.split('-')val = [(i[-1])*int(i[:-1]) for i in val]val = ''.join(val)val = Counter(val)return val
# a 列应用这个函数并车为列表:
df.a.map(func).to_list()
# 构造为 DataFrame,将空值填充为 0 并转为整型:
right = (pd.DataFrame(df.a.map(func).to_list()).fillna(0).astype(int)
)
right
# 这样就生成了右表数据,最后源数据与右表数据合并:
df.merge(right, left_index=True, right_index=True)
总结
以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。