我可以修改一个数据 sheet 以匹配另一个几乎相似的数据框的 ID 吗?
Can I amend one data sheet to match another data frame's ID that are almost similar?
我有多个数据框要比较。我的问题是产品 ID。一个设置如下:
- 000-000-000-000
- VS
- 000-000-000
(毛)
我看过这里、reddit、YouTube,甚至深入尝试过 .join、.append,以及一些我以前从未见过甚至理解的其他方法。有没有一种方法(或者更好的是一些我可以继续阅读以了解这一点的文档)从 Main excel sheet 中提取产品 ID,将其与应该匹配的产品 ID 进行比较。然后我会更喜欢在所有 sheet 中创建就地 ID。这样我就可以将这些 ID 用作索引并将 ID 与行数据进行并排比较?每个 ID 大约有 113 个值可供比较。那是 113 列,但对于每一行,如果有意义的话
示例:(彩色列是主要 sheet,非彩色列将与之进行比较)
补充说明:
突出显示的黄色 ID 是“唯一的”,我不会更改它们,而是将它们写入列表或其他内容,并在找到时使用 if 语句忽略它们。
编辑:
所以我写了这段代码,这几乎是我需要做的。
它去掉了我应用于所有 ID 的“-”。只需要制作一个唯一的 ID 列表,以跳过带走零
dfSS["Product ID"] = dfSS["Product ID"].str.replace("-", "")
那么这将只列出最多 9 位数字,唯一 ID 除外
dfSS["Product ID"] = dfSS["Product ID"]str[:9]
一旦我让它 100% 正常工作,将在下面添加完整代码
我现在在想怎么说
lst =[1,2,3,4,5]
if dfSS["Product ID"] not in lst:
dfSS["Product ID"] = dfSS["Product ID"].str.replace("-", "").str[:9]
这段代码不起作用,但每天我都越来越接近能够比较这些相似但不同的数据框。第一个只是我根本不想过滤的列表中 000-000-000 产品 ID 的示例。但保留在数据框中
如果 ID 转换是可预测的,那么一种选择是使用正则表达式对 ID 进行均质化。例如,如果情况只是删除前三位数字,则可以使用如下内容:
df['short_id'] = df['long_id'].str.extract(r'\d\d\d-([\d-]*)')
如果 ID 转换不是那么可预测(例如,由于转录错误或数据中的一些其他噪声),那么最好的选择是首先使用 recordlinkage
之类的方法消除 ID 转换的歧义,参见示例here.
好的,每个带有或不带有破折号、#、字母等的产品 ID 都解决了这个问题。
(\d\d\d-)?[_#\d-]?[a-zA-Z]?
(\d\d\d-)? -这是针对前三个整数集,带有零个或多个匹配项和破折号(非贪婪)
[_#\d-]? - 这适用于任何特殊字符和附加数字(非贪婪)
[a-zA-Z]? - 这个,不知道为什么,但我不得不从最后一部分中分离出来,因为它不会接收每一个字母。 (非贪婪)
通过以上,我解决了 RE 所需的一切。
我在哪里学习如何提高我的 RE 技能:
Automate the Boring Stuff- Ch 7
显示此内容的其他方式。把它放在这里是为了表明没有一种方法可以做到这一点。 RE 超级棒:
(\d{3}-)?[_#\d{3}-]?[a-zA-Z]?
我有多个数据框要比较。我的问题是产品 ID。一个设置如下:
- 000-000-000-000
- VS
- 000-000-000
(毛)
我看过这里、reddit、YouTube,甚至深入尝试过 .join、.append,以及一些我以前从未见过甚至理解的其他方法。有没有一种方法(或者更好的是一些我可以继续阅读以了解这一点的文档)从 Main excel sheet 中提取产品 ID,将其与应该匹配的产品 ID 进行比较。然后我会更喜欢在所有 sheet 中创建就地 ID。这样我就可以将这些 ID 用作索引并将 ID 与行数据进行并排比较?每个 ID 大约有 113 个值可供比较。那是 113 列,但对于每一行,如果有意义的话
示例:(彩色列是主要 sheet,非彩色列将与之进行比较)
补充说明: 突出显示的黄色 ID 是“唯一的”,我不会更改它们,而是将它们写入列表或其他内容,并在找到时使用 if 语句忽略它们。
编辑: 所以我写了这段代码,这几乎是我需要做的。 它去掉了我应用于所有 ID 的“-”。只需要制作一个唯一的 ID 列表,以跳过带走零
dfSS["Product ID"] = dfSS["Product ID"].str.replace("-", "")
那么这将只列出最多 9 位数字,唯一 ID 除外
dfSS["Product ID"] = dfSS["Product ID"]str[:9]
一旦我让它 100% 正常工作,将在下面添加完整代码
我现在在想怎么说
lst =[1,2,3,4,5]
if dfSS["Product ID"] not in lst:
dfSS["Product ID"] = dfSS["Product ID"].str.replace("-", "").str[:9]
这段代码不起作用,但每天我都越来越接近能够比较这些相似但不同的数据框。第一个只是我根本不想过滤的列表中 000-000-000 产品 ID 的示例。但保留在数据框中
如果 ID 转换是可预测的,那么一种选择是使用正则表达式对 ID 进行均质化。例如,如果情况只是删除前三位数字,则可以使用如下内容:
df['short_id'] = df['long_id'].str.extract(r'\d\d\d-([\d-]*)')
如果 ID 转换不是那么可预测(例如,由于转录错误或数据中的一些其他噪声),那么最好的选择是首先使用 recordlinkage
之类的方法消除 ID 转换的歧义,参见示例here.
好的,每个带有或不带有破折号、#、字母等的产品 ID 都解决了这个问题。
(\d\d\d-)?[_#\d-]?[a-zA-Z]?
(\d\d\d-)? -这是针对前三个整数集,带有零个或多个匹配项和破折号(非贪婪)
[_#\d-]? - 这适用于任何特殊字符和附加数字(非贪婪)
[a-zA-Z]? - 这个,不知道为什么,但我不得不从最后一部分中分离出来,因为它不会接收每一个字母。 (非贪婪)
通过以上,我解决了 RE 所需的一切。
我在哪里学习如何提高我的 RE 技能:
Automate the Boring Stuff- Ch 7
显示此内容的其他方式。把它放在这里是为了表明没有一种方法可以做到这一点。 RE 超级棒:
(\d{3}-)?[_#\d{3}-]?[a-zA-Z]?