![212dffd0283955e366c3bce6265ae892.png](https://i-blog.csdnimg.cn/blog_migrate/c13fc8a928edc980103ba5cc59b42e19.jpeg)
需求来源为知友的一个提问:
pandas如何新增一列,对相同的行赋同一个值?www.zhihu.com希望将整行内容一样的内容做同样的标识,可能用于相同内容的筛选。话不多说,咱们直接进入解题。
首先先造个数据:
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 因子化:
Pandas 因子化(枚举化)值www.gairuo.com![a77b45979bc2571aa2883cc7c5ee3828.png](https://i-blog.csdnimg.cn/blog_migrate/5e833b226b753136c6b24af2f25c29b2.png)
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()来增加这个新列。
(完)