Python 将dict列表与pandas系列进行比较,并根据匹配项填充dict

Python 将dict列表与pandas系列进行比较,并根据匹配项填充dict,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个dict列表,如果在一个系列中发现dict中的多个值匹配,我希望通过更新dict来填充该列表。e、 g lis_of_dicts = [{'A':'a', 'B':'b','C':'c', 'D':'d'}, {'A':'1', 'B':'2','C':'3','D':'4'}, {'A':'M','B':'N','C':'O','D':'P'}] dd = {'col1':['b', 'M'], 'col2':['d'

我有一个dict列表,如果在一个系列中发现dict中的多个值匹配,我希望通过更新dict来填充该列表。e、 g

lis_of_dicts = [{'A':'a', 'B':'b','C':'c', 'D':'d'},
                {'A':'1', 'B':'2','C':'3','D':'4'}, 
                {'A':'M','B':'N','C':'O','D':'P'}]

dd = {'col1':['b', 'M'], 'col2':['d','P'], 'col3':['7.5','29']}
df = pd.Dataframe(dd, columns = ['col1', 'col2', 'col3']) 
pd_series = pd.Series(tuple(value) for value in df.values), index=df.index)
这产生了:

0 (b, d, 7.5)
1 (M, P, 29)
预期结果:

[{'A':'a', 'B':'b','C':'c', 'val': '7.5','D':'d'}, 
 {'A':'1', 'B':'2','C':'3', 'val':'NA', 'D':'4'}, 
 {'A':'M','B':'N','C':'O','val':'29','D':'P'}]
我尝试了这个,但我甚至无法获得比赛,因此无法继续:

for i in pd_series:
    for x in lis_of_dicts:
        if [x[key] == i[0] in x and [x[key] == i[1] in x for key in x]:
            x.update({'val':'i[2]'})
        else:
            x.update({'val':'NA'})

我无法生成任何结果。注意,dict的顺序应该保持不变,只是添加的值应该在字典中最后一项之前

我会选择基于嵌套循环的解决方案:

>>> df_2 = pd.DataFrame(lis_of_dicts)
>>> df_2
   A  B  C  D
0  a  b  c  d
1  1  2  3  4
2  M  N  O  P
>>> cols = df_2.columns
>>> for ix, row in df_2.iterrows():
...     for item in pd_series:
...         if set(row[cols]) & set(item):
...             df_2.loc[ix, 'val'] = item[2]
...             break
...     else:
...         df_2.loc[ix, 'val'] = 'NA'

>>> df_2.to_dict('r')
[{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'val': 7.5},
 {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'val': 'NA'},
 {'A': 'M', 'B': 'N', 'C': 'O', 'D': 'P', 'val': 29}]
编辑: 它可以简化如下:

output = []
for d in lis_of_dicts:
    for item in pd_series:
        if set(d.values()) & set(item):
            d['val'] = item[2]
            break
    else:
        d['val'] = 'NA'
    output.append(d)
>>> output
[{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'val': 7.5},
 {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'val': 'NA'},
 {'A': 'M', 'B': 'N', 'C': 'O', 'D': 'P', 'val': 29}]
编辑2

注意:这只能在python版本>=3.7中可靠地工作,因为对于较低版本,不能保证在
dict
s中维护顺序

要将
val
置于最后第二个元素中:

output = []
for d in lis_of_dicts:
    last = d.popitem()
    for item in pd_series:
        if set(d.values()) & set(item):
            d['val'] = item[2]
            d.update([last])
            break
    else:
        d['val'] = 'NA'
        d.update([last])
    output.append(d)

>>> output
[{'A': 'a', 'B': 'b', 'C': 'c', 'val': 7.5, 'D': 'd'},
 {'A': '1', 'B': '2', 'C': '3', 'val': 'NA', 'D': '4'},
 {'A': 'M', 'B': 'N', 'C': 'O', 'val': 29, 'D': 'P'}]

我会选择基于嵌套循环的解决方案:

>>> df_2 = pd.DataFrame(lis_of_dicts)
>>> df_2
   A  B  C  D
0  a  b  c  d
1  1  2  3  4
2  M  N  O  P
>>> cols = df_2.columns
>>> for ix, row in df_2.iterrows():
...     for item in pd_series:
...         if set(row[cols]) & set(item):
...             df_2.loc[ix, 'val'] = item[2]
...             break
...     else:
...         df_2.loc[ix, 'val'] = 'NA'

>>> df_2.to_dict('r')
[{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'val': 7.5},
 {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'val': 'NA'},
 {'A': 'M', 'B': 'N', 'C': 'O', 'D': 'P', 'val': 29}]
编辑: 它可以简化如下:

output = []
for d in lis_of_dicts:
    for item in pd_series:
        if set(d.values()) & set(item):
            d['val'] = item[2]
            break
    else:
        d['val'] = 'NA'
    output.append(d)
>>> output
[{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'val': 7.5},
 {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'val': 'NA'},
 {'A': 'M', 'B': 'N', 'C': 'O', 'D': 'P', 'val': 29}]
编辑2

注意:这只能在python版本>=3.7中可靠地工作,因为对于较低版本,不能保证在
dict
s中维护顺序

要将
val
置于最后第二个元素中:

output = []
for d in lis_of_dicts:
    last = d.popitem()
    for item in pd_series:
        if set(d.values()) & set(item):
            d['val'] = item[2]
            d.update([last])
            break
    else:
        d['val'] = 'NA'
        d.update([last])
    output.append(d)

>>> output
[{'A': 'a', 'B': 'b', 'C': 'c', 'val': 7.5, 'D': 'd'},
 {'A': '1', 'B': '2', 'C': '3', 'val': 'NA', 'D': '4'},
 {'A': 'M', 'B': 'N', 'C': 'O', 'val': 29, 'D': 'P'}]


我想要一个更新字典的列表,因为outputval只是您想要命名的任何字符串,但是该值是根据pandas系列中的第3列选择的。这里的df是什么?@Starter这不是cs95的意思。简单地说,请在问题中添加df。你可以从这里开始。我添加了DataFrame我想要一个更新字典的列表,因为outputval只是你想要命名的任何字符串,但是该值是根据pandas系列中的第3列选择的df在这里是什么?@Starter这不是cs95的意思。简单地说,请在问题中添加df。你可以从这里开始。我添加了dataframeThis,但这并不能解决我的问题,我更新了所需的result@Starter您好,如果您遇到了让此解决方案为您服务的问题,那么解释一下原因将非常有帮助。我们需要了解你所看到的,而我们没有看到的。我们想帮助你,但你必须让我们这样做。干杯:-)我提供了我所有的信息。我不确定还有什么能帮上忙。如果你有什么想法,请告诉我。没关系。在尝试此解决方案时,您能告诉我们您面临的问题吗?附加值没有得到填充。这是一个大文件,可能集合不起作用,因为要匹配的值可能在不同的字典中,而这些字典在目录列表中相距很远。但这并不能解决我的问题,我更新了所需的result@Starter您好,如果您在使用此解决方案时遇到问题,解释一下原因是非常有帮助的。我们需要了解你所看到的,而我们没有看到的。我们想帮助你,但你必须让我们这样做。干杯:-)我提供了我所有的信息。我不确定还有什么能帮上忙。如果你有什么想法,请告诉我。没关系。在尝试此解决方案时,您能告诉我们您面临的问题吗?附加值没有得到填充。这是一个很大的文件,而且由于要匹配的值可能在dict列表中相距很远的不同词典中,所以该集可能无法工作