python 由列表索引的数据框
python dataframe indexed by a list
我正在尝试获取一个包含有限集中重复值的 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]]
因为它是一个索引列表....
请帮助?怎么可能加快速度?
非常感谢!
我不确定我是否正确理解了您的示例。
这是你想要达到的目标吗? (除了指数的偏差(零而不是一个)):
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 的计数器而不是检查索引的大小)
我会构建一个包含您要替换的值的字典,然后调用 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
您可以将 rank
与 dense
方法一起使用:
>>> 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,依此类推。
我正在尝试获取一个包含有限集中重复值的 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]]
因为它是一个索引列表....
请帮助?怎么可能加快速度?
非常感谢!
我不确定我是否正确理解了您的示例。 这是你想要达到的目标吗? (除了指数的偏差(零而不是一个)):
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 的计数器而不是检查索引的大小)
我会构建一个包含您要替换的值的字典,然后调用 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
您可以将 rank
与 dense
方法一起使用:
>>> 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,依此类推。