【发布时间】:2022-02-08 15:33:26
【问题描述】:
为了使数据匿名,我需要用一组不同的新 ID 替换原始 ID,但在替换后仍然有相同的原始 ID 在所有字段中匹配。挑战就是这样做在这个 Pandas DataFrame 中优雅地跨越 4 种不同的 ID 表示。
我有真实世界的数据,其中数字 ID 有 4 种可能的格式:
- 在字符串列表中
'["38", "15", "42"]' - 在号码列表中
[14, 42, 94] - 作为整数
42 - 作为浮动
1.0
这是一个包含所有 4 种数据类型的通用小型 DataFrame。
df = pd.DataFrame([['["38", "15", "42"]', [14, 42, 94], 42, 1.0],\
['["8", "28"]', [1, 4], 8, 94.0], ['["12"]', [12], 12, 12.0]],\
columns = ['CommentsID','AgentID','CaseID','TicketID'])
df
| CommentsID | AgentID | CaseID | TicketID |
| --------------------- | --------------- | ------- | -------- |
| ['38', '15', '42'] | [14, 42, 94] | 42 | 1.0 |
| ['8', '28'] | [1, 4] | 8 | 94.0 |
| ['12'] | [12] | 12 | 12.0 |
为了便于在通用示例中使用,我只是添加 100 来生成“新 ID”列表。 但是,在实际问题中,对应的新ID列表是随机生成的,所以没有全程加100来解决这个问题。
orig_ids = list(range(100))
new_ids = [x + 100 for x in orig_ids]
我想要找到最有效的方法,用这四种数据类型的新 ID 替换数据框中的所有原始 ID。
到目前为止我最好的解决方案是分成三个部分:
- 使用
replace()函数处理float 和int 版本(这不会影响列表,即使使用regex=True):
df = df.replace(orig_ids, new_ids)
- 对于整数列表,使用远离 Python 的双重 for 循环来匹配 ID 列表上的索引:
def newIDnumbers(datacol):
newlist = []
for i in range(len(datacol)):
numlist = [orig_ids.index(x) for x in df.AgentID[i]]
newlistrow = []
for idx in range(len(numlist)):
newlistrow.append(new_ids[numlist[idx]])
newlist.append(newlistrow)
return newlist
df.AgentID = newIDnumbers(df.AgentID)
df
- 对于字符串列表,构建原始 id 和新 id 的字符串列表,然后使用远离 Python 的双重 for 循环来匹配 ID 列表上的索引:
str_orig_ids = [str(x) for x in orig_ids]
str_new_ids = [str(x) for x in new_ids]
def newIDstrings(datacol):
newlist = []
for i in range(len(datacol)):
numlist = [str_orig_ids.index(x) for x in datacol.str.findall(r'"(\d*)"')[i]]
newlistrow = []
for idx in range(len(numlist)):
newlistrow.append(str_new_ids[numlist[idx]])
newlist.append(newlistrow)
return newlist
df.CommentsID = [str(x) for x in newIDstrings(df.CommentsID)]
df
有没有人有更优雅、计算量更少的方法来实现这个输出?
df
| CommentsID | AgentID | CaseID | TicketID |
| --------------------- | --------------- | ------- | -------- |
| ['138', '115', '142'] | [114, 142, 194] | 142 | 100.0 |
| ['108', '128'] | [101, 104] | 108 | 194.0 |
| ['112'] | [112] | 112 | 112.0 |
【问题讨论】:
标签: python pandas dataframe replace str-replace