由列表索引的python数据帧

时间:2015-04-02 13:55:09

标签: python list indexing pandas dataframe

我正在尝试使用包含有限集重复值的DataFrame列,并用索引号替换这些值,因此如果值为[200,20,1000,1],则它们的出现的索引将为[1 ,2,3,4]。 实际数据示例是:

0    aaa
1    aaa
2    bbb
3    aaa
4    bbb
5    bbb
6    ccc
7    ddd
8    ccc
9    ddd

所需的输出是

0    1
1    1
2    2
3    1
4    2
5    2
6    4
7    3
8    4
9    3

我想改变对数字没什么意义的值。这就是...我不关心索引的顺序,即1可以是3,依此类推,只要排序是一致的。即,我不关心['aaa','bbb','ccc','ddd']是否会被[1,2,3,4][2,4,3,1]编入索引。

假设DF名称是tbl,我想只更改列'aaa'中的索引子集。让我们用tbl_ind表示这些索引。我想这样做的方式是:

tmp_r = tbl[tbl_ind]
un_r_ind = np.unique(tmp_r)
for r_ind in range(len(un_r_ind)):
    r_ind_ind = np.array(np.where(tmp_r == un_r_ind[r_ind])[0])
    for j_ind in range(len(r_ind_ind)):
        tbl['aaa'].iloc[tbl_ind[r_ind_ind[j_ind]]] = r_ind

有效。在大型数据集上它真的很慢。 Python不允许更新tbl['aaa'].iloc[tbl_ind[r_ind_ind]],因为它是索引列表.... 请帮忙?怎么可能加快这个速度? 非常感谢!

3 个答案:

答案 0 :(得分:2)

我构建了一个你要替换的值的字典,然后调用map

In [7]:

df
Out[7]:
  data
0     
1  aaa
2  bbb
3  aaa
4  bbb
5  bbb
6  ccc
7  ddd
8  ccc
9  ddd
In [8]:

d = {'aaa':1,'bbb':2,'ccc':3,'ddd':4}
df['data'] = df['data'].map(d)
df

Out[8]:
   data
0      
1     1
2     2
3     1
4     2
5     2
6     3
7     4
8     3
9     4

答案 1 :(得分:2)

您可以将rankdense方法一起使用:

>>> df[0].rank("dense")
0    1
1    1
2    2
3    1
4    2
5    2
6    3
7    4
8    3
9    4
Name: 0, dtype: float64

这基本上对值进行排序并将最低值映射到1,将第二个最低值映射到2,依此类推。

答案 2 :(得分:1)

我不确定我是否从你的例子中正确理解了。 这是你想要实现的目标吗? (除了对指数的偏见(零而不是一)):

df=['aaa','aaa','bbb','aaa','bbb','bbb','ccc','ddd','ccc','ddd']
idx={}

def index_data(v):
    global idx

    if v in idx:
        return idx[v]
    else:
        n = len(idx)
        idx[v] = n
        return n

if __name__ == "__main__":
    outlist = []
    for i in df:
        outlist.append(index_data(i))
    for i, v in enumerate(outlist):
        print i, v

输出:

0 0
1 0
2 1
3 0
4 1
5 1
6 2
7 3
8 2
9 3

显然它可以被优化(例如简单地递增n的计数器而不是检查索引的大小)