看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
需求希望将整行内容一样的内容做同样的标识,可能后续会用于相同内容的筛选。
首先构造数据:
import pandas as pd
# 构造数据
df = pd.DataFrame([
[1,2,4,6],
[3,5,6,9],
[1,2,4,6],
[3,5,6,9],
[3,5,6,2],
], columns=list('abcd'))
df
'''
a b c d
0 1 2 4 6
1 3 5 6 9
2 1 2 4 6
3 3 5 6 9
4 3 5 6 2
'''
以上我们构造了四行数据,其中0和2相同,1和3相同,接下来就增加一列,预期为相同行为相同值,解决方案如下:
# 解决方案
df.assign(f=pd.factorize(df.apply(lambda x: str(x.values), axis=1))[0])
'''
a b c d f
0 1 2 4 6 0
1 3 5 6 9 1
2 1 2 4 6 0
3 3 5 6 9 1
4 3 5 6 2 2
'''
我们拆分解析一下过程,先将原数据加工成一个新的列,行数据为所有列的内容组成的列表:
df.apply(lambda x: str(x.values), axis=1)
'''
0 [1 2 4 6]
1 [3 5 6 9]
2 [1 2 4 6]
3 [3 5 6 9]
4 [3 5 6 2]
dtype: object
'''
使用pandas.factorize()将这个Series因子化:
pd.factorize(df.apply(lambda x: str(x.values), axis=1))
'''
(array([0, 1, 0, 1, 2]),
Index(['[1 2 4 6]', '[3 5 6 9]', '[3 5 6 2]'], dtype='object'))
'''
结果是一个元组,第一个元素是因子的值,第二个是不重复的元素,所以我们使用切片取到第一个值。最后用df.assign()来增加这个新列。
更新时间:Aug. 18, 2024, 3:41 p.m. 标签:pandas python 赋值