遍历数据框和字典以更新数据框中的值,以便与 python 匹配字符串
Posted
技术标签:
【中文标题】遍历数据框和字典以更新数据框中的值,以便与 python 匹配字符串【英文标题】:iterate through dataframe and dictionary to update values in dataframe for matching strings with python 【发布时间】:2021-10-23 11:03:52 【问题描述】:我有一本字典:
dict = "name1":["name1_a, "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]
然后我读入一个 .csv 文件作为具有以下结构的数据框:
df = pd.read_csv('file.csv')
Name | Value |
---|---|
"name1" | 10 |
"name1_b" | 30 |
"name2_c" | 30 |
我需要一个函数来遍历数据框和字典,以某种方式在数据框中搜索字典列表中的每个名称(“name1_a”、“name1_b”等)。一旦找到匹配项,比如“name1_b”,它应该将相应的值 (30) 添加到数据框中的“name1”。如果数据框中不存在名称(如示例中的“name2”),则应创建一个新行并分配与“name2_a”+“name2_b”等之和对应的值。
所以结果数据框应该是这样的(“name_1b”的值被添加到“name1”的值中,“name2”被创建并分配了“name2_c”的值):
Name | Value |
---|---|
"name1" | 40 |
"name1_b" | 30 |
"name2_c" | 30 |
"name2" | 30 |
感谢您的帮助!
【问题讨论】:
你能把这个写成一个工作例子吗……至少是字典和数据框的初始化。我们应该能够复制/粘贴来解决问题。 名字是唯一的吗?例如,“name1”会在“名称”列中出现多次吗? 是的,名称在数据框中是唯一的 数据框中没有“name2_a”,所以我无法分配与“name2_a”+“name2_b”之和对应的值。考虑到dict
中的 name:list_of_names 对,您似乎想将 list_of_names 的值添加到 name,不存在的名称默认为 0。
是的@tdelaney我认为你的解释是正确的,因为只有“name2_c”在数据框中,函数必须为“name”创建一个新行并为其分配“name2_c”的值
【参考方案1】:
遍历字典项并从匹配的键和值列表中屏蔽数据框,并使用 .sum() 获取总和值。如果数据框中存在特定名称,只需分配值,否则创建一个新行。
dict_ = "name1":["name1_a", "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]
for k,v in dict_.items():
mask_list = v + [k]
sum_value = df[df['Name'].isin(mask_list)]['Value'].sum()
if k in df['Name'].unique():
df.loc[df['Name'] == k, 'Value'] = sum_value
else:
df.loc[len(df.index)] = [k, sum_value]
【讨论】:
【参考方案2】:您可以首先尝试通过 dict comprehension 从列表中创建一个键:值对,然后检查 dd
中是否存在“名称”并过滤掉结果,然后使用 @987654322 将“名称”的值替换为它们的值@ 和 assign()
分配更改,然后将此新数据帧附加到原始数据帧中,然后按“名称”分组并计算总和:
d="name1":["name1_a", "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]
dd=i:k for k,v in d.items() for i in v
df=(df.append(df[df['Name'].isin(dd)]
.assign(Name=lambda x:x['Name'].replace(dd)))
.groupby('Name',as_index=False).sum())
或
方法相同,但步骤不同:
d="name1":["name1_a", "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]
dd=i:k for k,v in d.items() for i in v
df1=df[df['Name'].isin(dd)]
df1['Name']=df1['Name'].map(dd)
df=df.append(df1,ignore_index=True)
df=df.groupby('Name',as_index=False)['name2'].sum()
df
的输出:
Name name2
0 name1 40
1 name1_b 30
2 name2 30
3 name2_c 30
注意:不要给python中的dict
函数赋值
【讨论】:
【参考方案3】:您可以按名称索引df
,并创建一个单独的数据框来保存将添加到 df 的值。 dict
中的一些目标键不会在 df
中,因此需要使用默认值添加它们。它与dict
中的加数列表类似,有些没有值,需要一个默认值。
一旦这两个设置完成,您就可以遍历加数,收集总和并将它们添加到df
。
import pandas as pd
df = pd.DataFrame("Name":["name1", "name1_b", "name2_c"],
"Value":[10, 30, 30])
# map of target:addends to apply to dataframe
mydict = "name1":["name1_a", "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]
# index dataframe by name and default unknown values
df.set_index("Name", inplace=True)
unknowns = pd.DataFrame(index=mydict.keys()-df.index)
unknowns["Value"] = 0
df = df.append(unknowns)
del unknowns
# create dataframe addends, defaulting unknown values
addends_df = pd.DataFrame(index=val for values in mydict.values()
for val in values)
addends_df["Value"] = df
addends_df.fillna(0, inplace=True)
# for each target, add the addends
for target, addends in mydict.items():
df.loc[target] += addends_df.loc[addends].sum()
print(df)
【讨论】:
感谢您的清晰解释!效果很好:)以上是关于遍历数据框和字典以更新数据框中的值,以便与 python 匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章