我有一本字典:
dict = {"name1":["name1_a, "name1_b"], "name2":["name2_a", "name2_b", "name2_c"]
然后我读取。csv文件作为具有以下结构的数据框架:
df = pd.read_csv('file.csv')
您可以按名称索引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]