有两个数据,数据一:
name | number |
---|---|
Aya | A125; B45 |
Ben | C163; D525; A58; P58 |
…… | …… |
Zen | B45 |
数据二:
number | info1 | grade | rank |
---|---|---|---|
B45; A58 | 1 | 0 | 3 |
D525 | 2 | 1 | 3 |
…… | …… | …… | …… |
A125 | 1 | 0 | 0 |
根据数据一【number】,找到数据二里的信息【info1,grade, rank 】,最后求和或者加减,例如得到:
name | number | info1 | grade | rank |
---|---|---|---|---|
Aya | A125; B45 | 2 | 0 | 3 |
我现在的想法是数据二的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字段。具体步骤如下:
\w+
匹配出所有的字母和数字组合。以下是一个示例代码,演示如何根据数据一的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()
只能查找单个元素的位置。
为了解决这个问题,可以使用以下方法来处理:
combined_info
来存储合并后的信息。number
列的值。number
列的值拆分成一个列表,使用 split("; ")
方法。temp_dict
来存储该元素在数据表二中对应的信息(info1
,grade
和rank
)。number
列是否包含步骤 4 中的元素。info1
、grade
和 rank
信息存储到 temp_dict
中。temp_dict
添加到 combined_info
列表中。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
进行求和或加减运算。