看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求是有一个列表,列表中由字母和数字组成,需要将这个列表转为字典,键为字母,值为字母后的数字,如果多个数字刚组成列表。由于用 Python 的原生代码实现比较复杂,我们这里利用 pandas 的实用功能来解决这个问题。
原始数据为一个列表,如下代码,这个列表由(字母、数字)形式循环组成,期中数字可能会连续出现多个:
m = ['a',1,'b',13,14,'d',67]
m
# ['a', 1, 'b', 13, 14, 'd', 67]
现在需要将以形式的数据转为以下形式:
{'a': 1, 'b': [13, 14], 'd': 67}
它是一个字典,键是前边的字母,值是字母后边的数字,如果有多个字母则是一个列表。
这个问题还是有点复杂的,如果用纯 Python 代码解决也不是不可以,需要复杂的逻辑和比较多的代码量,这里我们暂不考虑有原生的 Python 代码处理,利用 pandas 的能力解决。
首先,这个原数据是一个列表,我们可以将这个列表放入一个 Series 或者 DataFrame 的一列,然后增加辅助列判断是不是字母,将不是字母的用它之前的字母填充,这样将所有的数字对应到它的上个字母上。
最后再按这些字母进行分组,对应数字被分到相应的字母里,方便们将其转为以该字母为键的值。
先将数据读取到 DataFrame 中,后续我们要增加辅助列来解决问题:
m = ['a',1,'b',13,14,'d',67]
df = pd.DataFrame({'x': m})
df
'''
x
0 a
1 1
2 b
3 13
4 14
5 d
6 67
'''
先增加一个辅助列 y,where 判断 x 列是不是一个字母,如果不是字母的就是 NaN 缺失值,相当于将数字挖掉;再增加一个辅助列 z,它来填充掉缺失值,使用 ffill() 方法缺失值会取它前边的值。代码如:
(
df.assign(y=df.x.where(df.x.str.isalpha()))
.assign(z=lambda x: x.y.ffill())
)
'''
x y z
0 a a a
1 1 NaN a
2 b b b
3 13 NaN b
4 14 NaN b
5 d d d
6 67 NaN d
'''
有了 z 列我们我们就可以用这列进行分组,在分组前还需要删除掉它个自身所在的列,我们用 query(),非常方便:
(
df.assign(y=df.x.where(df.x.str.isalpha()))
.assign(z=lambda x: x.y.ffill())
.query('x!=z')
)
'''
x y z
1 1 NaN a
3 13 NaN b
4 14 NaN b
6 67 NaN d
'''
这样就得到了 x 和 z 列我们想要的分组数据,接下来对 z 列分组并对 x 列聚合,聚合使用 agg() 。在聚合时如果 x 的长度大于 1 就将把它转为列表:
(
df.assign(y=df.x.where(df.x.str.isalpha()))
.assign(z=lambda x: x.y.ffill())
.query('x!=z')
.groupby('z')
.x
.agg(lambda x: list(x) if len(x) > 1 else x)
)
'''
z
a 1
b [13, 14]
d 67
Name: x, dtype: object
'''
最后再用 agg() 将这个 Series 转为字典,在 agg() 中直接传入 dict 对象就可以,非常方便:
(
df.assign(y=df.x.where(df.x.str.isalpha()))
.assign(z=lambda x: x.y.ffill())
.query('x!=z')
.groupby('z')
.x
.agg(lambda x: list(x) if len(x) > 1 else x)
.agg(dict)
)
# {'a': 1, 'b': [13, 14], 'd': 67}
以上就是这个需求的完整代码,虽然过程和代码有些长,但解决思路和逻辑非常清晰。另外,关于按一定规划对列表进行分组的需求也可以参考 pandas 将列表中有字母的元素分组 这个案例,和本需求解决思路类似。
由此可见,pandas 可以帮助我们建立矩阵化、向量化的思维,解决复杂的数据处理问题。
(完)
更新时间:2024-08-18 15:55:24 标签:pandas python 字典