python 查找列表中包含元素的位置

有两个数据,数据一:

namenumber
AyaA125; B45
BenC163; D525; A58; P58
…………
ZenB45

数据二:

numberinfo1graderank
B45; A58103
D525213
……………………
A125100

根据数据一【number】,找到数据二里的信息【info1,grade, rank 】,最后求和或者加减,例如得到:

namenumberinfo1graderank
AyaA125; B45203

我现在的想法是数据二的number成为list,遍历数据一的每一行,寻找每一个所在list的位置即数据二的位置。
这样好像无法搜寻到数据二number中有多个的情况。即B45无法在数据二的【B45; A58】被找到。

for row in range(len(df)):
    temp_list = df.loc[row, "number"].split(";  ")
    for index in range(len(temp_list)):
        temp_target = list.index(temp_list[index])

result = 0  # 初始化结果变量,用于存放求和或加减的结果

for row in range(len(df)):
    temp_list = df.loc[row, "number"].split(";  ")
    
    for index in range(len(temp_list)):
        temp_number = temp_list[index]
        matching_rows = data2[data2["number"].str.contains(temp_number)]
        
        if not matching_rows.empty:
            # 取第一个匹配行的信息
            info1 = matching_rows.iloc[0]["info1"]
            grade = matching_rows.iloc[0]["grade"]
            rank = matching_rows.iloc[0]["rank"]
            
            # 进行求和或加减操作
            result += grade  # 根据需要调整
            
print("Result:", result)  # 输出最终的结果

用gpt查询了一下,结果如下,请参考,如果有不清楚,可以随时沟通:
你的想法是正确的,可以通过将数据二中的number字段拆分成列表,并逐行遍历数据一来查找匹配项。但是,你提到的问题确实存在。如果数据二中的number字段包含多个值(例如"B45; A58"),那么简单地按照分号进行拆分可能无法与数据一中的number完全匹配。

为了解决这个问题,你可以考虑使用正则表达式来匹配数据二中的number字段。具体步骤如下:

  1. 遍历数据二,将每行的number字段拆分成列表。可以使用正则表达式 \w+ 匹配出所有的字母和数字组合。
  2. 将数据二中的number列表与数据一中的number进行比较,找到匹配的项。
  3. 根据匹配的项,累加或者计算对应的info1、grade和rank字段的值。

以下是一个示例代码,演示如何根据数据一的number字段在数据二中查找并求和相关字段:

import re

data1 = [
    {"name": "Aya", "number": "A125; B45"},
    {"name": "Ben", "number": "C163; D525; A58; P58"},
    # ... 其他数据
    {"name": "Zen", "number": "B45"}
]

data2 = [
    {"number": "B45; A58", "info1": 1, "grade": 0, "rank": 3},
    {"number": "D525", "info1": 2, "grade": 1, "rank": 3},
    # ... 其他数据
    {"number": "A125", "info1": 1, "grade": 0, "rank": 0}
]

# 遍历数据二,将number字段拆分成列表
for item in data2:
    item["number_list"] = re.findall(r'\w+', item["number"])

# 遍历数据一
for row in data1:
    number_list = row["number"].split("; ")

    # 初始化累加变量
    info1_sum = grade_sum = rank_sum = 0

    # 遍历数据二的每一行
    for item in data2:
        # 判断数据二中的number_list是否完全包含数据一中的number_list
        if set(number_list).issubset(item["number_list"]):
            # 匹配成功,累加相关字段的值
            info1_sum += item["info1"]
            grade_sum += item["grade"]
            rank_sum += item["rank"]

    # 更新数据一中的info1、grade和rank字段的值
    row["info1"] = info1_sum
    row["grade"] = grade_sum
    row["rank"] = rank_sum

print(data1)

这样,你就可以根据数据一中的number字段,在数据二中找到匹配项,并求和或进行其他操作。以上示例代码在Python环境下运行,你可以根据实际需要进行适当调整。

【以下回答由 GPT 生成】

问题中提到的代码中使用了split("; ")来将number列的字符串拆分成一个列表,然后使用list.index()方法查找元素在列表中的位置。这种方法无法处理number列有多个元素的情况,因为list.index()只能查找单个元素的位置。

为了解决这个问题,可以使用以下方法来处理:

  1. 创建一个空的列表 combined_info 来存储合并后的信息。
  2. 遍历数据表一的每一行,获取 number 列的值。
  3. number 列的值拆分成一个列表,使用 split("; ") 方法。
  4. 对于拆分后的每一个元素,使用一个新的空字典 temp_dict 来存储该元素在数据表二中对应的信息(info1graderank)。
  5. 遍历数据表二,对于每一行,判断该行的 number 列是否包含步骤 4 中的元素。
  6. 如果包含,则将该行的 info1graderank 信息存储到 temp_dict 中。
  7. temp_dict 添加到 combined_info 列表中。
  8. 最后,将 combined_info 列表合并到数据表一中。

下面是示例代码的实现:

combined_info = []

for row in range(len(df)):
    temp_list = df.loc[row, "number"].split("; ")
    temp_dict = {}

    for index in range(len(temp_list)):
        num = temp_list[index]

        for i in range(len(df2)):
            if num in df2.at[i, "number"]:
                temp_dict["info1"] = df2.at[i, "info1"]
                temp_dict["grade"] = df2.at[i, "grade"]
                temp_dict["rank"] = df2.at[i, "rank"]
                break

    combined_info.append(temp_dict)

df["combined_info"] = combined_info

此代码将数据表二的信息存储在 combined_info 列中,并将其添加到数据表一中。最后,你可以对 combined_info 进行求和或加减运算。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^