用唯一的增量字符串替换pandas Dataframe 中的每个唯一值

mklgxw1f  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(89)

我有一个4列宽6k行的数据框。

itm cla1 cla2 num
0   77   99    1  0.7
1   45   71   21  0.9
2   27   15   99    3
3   67   21   15  .11
4   77   15   90    7
...

在数据集中,我想将每个共享一个值的'itm'分组在一起,并用一个唯一的增量字符串替换它们。我想对'cla1'和'cla2'做同样的事情,只是我想让'cla1'和'cla2'共享唯一的增量字符串(在'itm'中没有使用)。
结果看起来像是

itm cla1 cla2 num
0   A0   X0  X98  0.7
1   A1   X1   X9  0.9
2   A2   X2   X0    3
3   A3   X3   X2  .11
4   A0   X5   X0    7
...

有什么建议吗?不幸的是,只是在每个值的开头添加一个字符串并不是我想要的。我希望它是递增的。

cmssoen2

cmssoen21#

您可以使用dict.fromkeys生成唯一值并保留它们的“可见”顺序。

>>> dict.fromkeys(df['itm'])
{77: None, 45: None, 27: None, 67: None}

使用enumerate可以构建Map:

>>> { k: f"A{n}" for n, k in enumerate(dict.fromkeys(df['itm'])) }
{77: 'A0', 45: 'A1', 27: 'A2', 67: 'A3'}

您可以.stack()多列,让它们使用相同的Map。

itm = { k: f"A{n}" for n, k in enumerate(dict.fromkeys(df['itm'])) }
cla = { k: f"X{n}" for n, k in enumerate(dict.fromkeys(df[['cla1', 'cla2']].stack())) }

然后,您可以将它们传递给.replace()

>>> df['itm'].replace(itm)
0    A0
1    A1
2    A2
3    A3
4    A0
Name: itm, dtype: object
>>> df[['cla1', 'cla2']].replace(cla)
  cla1 cla2
0   X0   X1
1   X2   X3
2   X4   X0
3   X3   X4
4   X4   X5
gwbalxhn

gwbalxhn2#

您可以先找到唯一值,然后按如下方式Map它:

from collections import defaultdict
import pandas as pd
a = [[77, 99, 1, 0.7],[45,   71, 21, 0.9],
   [27 ,  15,   99,    3],
   [67 ,  21,   15,  .11],
   [77  , 15,   90 ,   7]]
columns = ['itm', 'cla1', 'cla2', 'num']
df = pd.DataFrame(a, columns=columns)
itm_unique = set(df['itm'])
cla_unique = set(df['cla1']).union(set(df['cla2']))
d1 = {k: 'A'+str(idx) for idx, k in enumerate(itm_unique)}
d2 = {k: 'X'+str(idx) for idx, k in enumerate(cla_unique)}
df['itm'] = df.itm.map(d1)
df['cla1'] = df['cla1'].map(d2)
df['cla2'] = df['cla2'].map(d2)
df.head()
6tr1vspr

6tr1vspr3#

您可以将itmcla1cla2列中的所有唯一值作为一个系列,然后将前缀添加到这些系列中,然后合并回原始 Dataframe 并将原始列替换为合并后的索引:

items = df['itm'].drop_duplicates().reset_index(drop=True).add_prefix('A').reset_index()
clas = pd.concat([df['cla1'],df['cla2']]).drop_duplicates().reset_index(drop=True).add_prefix('X').reset_index()
df = df.reset_index(names='idx') \
       .merge(items, on='itm').drop('itm', axis=1).rename(columns={'index':'itm'}) \
       .merge(clas, left_on='cla1', right_on=0).drop(['cla1', 0], axis=1).rename(columns={'index':'cla1'}) \
       .merge(clas, left_on='cla2', right_on=0).drop(['cla2', 0], axis=1).rename(columns={'index':'cla2'}) \
       .set_index('idx').sort_index()

输出:

num itm cla1 cla2
idx
0    0.70  A0   X0   X4
1    0.90  A1   X1   X3
2    3.00  A2   X2   X0
3    0.11  A3   X3   X2
4    7.00  A0   X2   X5

相关问题