熊猫中的多列分解

时间:2013-05-09 02:39:56

标签: python pandas enumeration data-cleansing

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中是否有多列等效函数?

4 个答案:

答案 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}}