遍历dataframe和dictionary以更新dataframe中的值,以便与python匹配字符串



我有一本字典:

dict = {"name1":["name1_a, "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]

然后我读取。csv文件作为具有以下结构的数据框架:

df = pd.read_csv('file.csv')
<表类>名称价值tbody><<tr>"name1"10"name1_b">30"name2_c">30

您可以按名称索引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)

您可以首先尝试通过字典理解从列表中生成键:值对,然后检查dd中是否存在'Name'并过滤出结果,然后使用replace()assign()将'Name'的值替换为它们的值,然后将此新数据框添加到原始数据框中,然后按'Name'分组并计算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}
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函数赋值

遍历字典项并屏蔽匹配键和值列表中的数据帧,并使用.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] 

相关内容

  • 没有找到相关文章

最新更新