pandas factorize
函数将一系列中的每个唯一值分配给基于0的顺序索引,并计算每个系列条目所属的索引。
我想在多列上完成pandas.factorize
的等效操作:
import pandas as pd
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]})
pd.factorize(df)[0] # would like [0, 1, 2, 2, 1, 0]
也就是说,我想确定数据帧的几列中每个唯一值的元组,为每个列分配一个顺序索引,并计算数据帧中每一行所属的索引。
Factorize
仅适用于单列。 pandas中是否有多列等效函数?
答案 0 :(得分:12)
你需要首先创建一个元组的ndarray,pandas.lib.fast_zip
可以在cython循环中非常快地完成。
import pandas as pd
df = pd.DataFrame({'x': [1, 1, 2, 2, 1, 1], 'y':[1, 2, 2, 2, 2, 1]})
print pd.factorize(pd.lib.fast_zip([df.x, df.y]))[0]
输出是:
[0 1 2 2 1 0]
答案 1 :(得分:1)
我不确定这是否是一种有效的解决方案。可能有更好的解决方案。
arr=[] #this will hold the unique items of the dataframe
for i in df.index:
if list(df.iloc[i]) not in arr:
arr.append(list(df.iloc[i]))
所以打印arr会给你
>>>print arr
[[1,1],[1,2],[2,2]]
保存索引,我会声明一个ind数组
ind=[]
for i in df.index:
ind.append(arr.index(list(df.iloc[i])))
打印ind会给出
>>>print ind
[0,1,2,2,1,0]
答案 2 :(得分:0)
您可以使用drop_duplicates
删除这些重复的行
In [23]: df.drop_duplicates()
Out[23]:
x y
0 1 1
1 1 2
2 2 2
要实现目标,您可以将原始df加入drop_duplicated:
In [46]: df.join(df.drop_duplicates().reset_index().set_index(['x', 'y']), on=['x', 'y'])
Out[46]:
x y index
0 1 1 0
1 1 2 1
2 2 2 2
3 2 2 2
4 1 2 1
5 1 1 0
答案 3 :(得分:0)
{{1}}