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

yeotifhr  于 2023-10-13  发布在  其他
关注(0)|答案(3)|浏览(107)

我正在解析一个更大的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 s对应,但具有更易于阅读的形式(即1-x)。
如有任何建议,将不胜感激。

fdbelqdn

fdbelqdn1#

您可以执行以下操作:

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中所示。然后将dictMap到列上以获得新值。
请注意,您不需要担心值的顺序: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)
2hh7jdfx

2hh7jdfx2#

尝试使用pd.factorize()

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

df['id'] = np.char.add('id',(pd.factorize(df['id'])[0]+1).astype(str))
cig3rfwq

cig3rfwq3#

一种方法是使用hash_pandas_object()函数对id列进行散列。由于散列每次都是可复制的,因此您将拥有一个格式一致的ID,并且随着时间的推移保持不变。
以下是StackOverflow的答案:Get the same hash value for a Pandas DataFrame each time

相关问题