将唯一列值重新分配给更简单的名称
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)]
我正在解析一个更大的 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)]