将唯一列值重新分配给更简单的名称

Reassigning unique column values to easier names

我正在解析一个更大的 csv,看起来大致如下:

time   id        angle
0.0   1_2_3       ...
0.0   ad_42       ...
0.0   34_02_03    ...
0.1   1_2_3       ...
0.1   ad_42       ...
0.1   f_1         ...
....

如您所见,id 字段在命名示意图中有很多变化,但肯定有重复的值。我的目标是读取 csv 并重新分配 id 值,因为它们在跟踪共同值时出现。所以最好写入数据框并输出如下:

time   id      angle
0.0   id1       ...
0.0   id2       ...
0.0   id3       ...
0.1   id1       ...
0.1   id2       ...
0.1   id4       ...
....

其中 id 对应但具有更易读的形式(即 1-x)。

如有任何建议,我们将不胜感激。

一种方法是使用 hash_pandas_object() 函数对 id 列进行哈希处理。由于哈希每次都可重现,因此您将拥有一个格式一致的 ID,该 ID 会随着时间的推移保持不变。

这是 Whosebug 的回答:每次为 Pandas DataFrame 获取相同的哈希值

你可以这样做:

ids = df['id'].unique().tolist()
id_dict = {ids[i-1]:'id'+str(i) for i in range(1,len(ids)+1)}
df['id'] = df['id'].map(id_dict)

ids 为您提供唯一的 ID 值,并为每个唯一的 id 分配一个 ID + 编号,如 id_dict 中所示。然后将字典映射到您的列以获取新值。

请注意,您无需担心值的顺序:unique() - 保留值出现的顺序。

对于块:

如果你正在处理块,你可以做如下 - 只需要注意识别不可用的键和索引附加 'id':

id_dict = {}
dict_size = 0
for chunk in chunks:
    chunk_na = chunk.loc[~chunk['id'].isin(id_dict)]
    if len(chunk_na) > 0:
        na_ids = chunk_na['id'].unique().tolist()
        id_dict.update({na_ids[i-1-dict_size]:'id'+str(i) for i in range(dict_size+1,len(na_ids)+dict_size+1)}
        dict_size += len(id_dict)

    chunk['id'] = chunk['id'].map(id_dict)

尝试使用 pd.factorize()

df['id'] = ['id{}'.format(i) for i in (pd.factorize(df['id'])[0]+1)]