遍历数据框和字典以更新数据框中的值,以便与 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 匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

用 Pandas 数据框中的行填充嵌套字典

遍历熊猫数据框中的列

用Pandas数据框中的值注释热图

使用 Pandas 数据框中的值注释热图

如何在VBA中的用户窗体上使用组合框和文本框来搜索和查找活动Excel电子表格中的数据?

如何为存储为字典中的值的数据框提供文本键?