Python 基于具有字典值的列在Dataframe中添加列

Python 基于具有字典值的列在Dataframe中添加列,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个名为df_sample的数据帧。它包含三列。第一列(“pid”)是项目的标识号。第二列(“did”)是项目所在位置的标识。第三列(“tid_dict”)是一本词典,其中列出了物品应该来自何处,以及该地点有多少库存物品 我想检查(A)物品实际来自其应来自的位置之一的频率,以及(B)物品是否来自数量最大的位置。更复杂的是,有时项目无法从任何位置找到,有时它来自预期之外的其他地方。以下内容设置了一个示例数据帧: import pandas as pd column_names = [&quo

我有一个名为df_sample的数据帧。它包含三列。第一列(“pid”)是项目的标识号。第二列(“did”)是项目所在位置的标识。第三列(“tid_dict”)是一本词典,其中列出了物品应该来自何处,以及该地点有多少库存物品

我想检查(A)物品实际来自其应来自的位置之一的频率,以及(B)物品是否来自数量最大的位置。更复杂的是,有时项目无法从任何位置找到,有时它来自预期之外的其他地方。以下内容设置了一个示例数据帧:

import pandas as pd 
column_names = ["pid", "tid", "tid_dict"]
data = [['p26CE0DEAC1', 't29', {'t29': 50, 't121': 41, 't140': 33}], ['p5505CB1A96', 't121', {'t156': 48}], ['p1B9E6A73EC', 't256',{}]]

df_sample = pd.DataFrame(data, columns = column_names)
然后我想添加一个名为“loc_check”的新列,检查“tid”中的值是否是“tid_dict”中的键之一。然后是第二个名为“inv_check”的新列,查看它是否是可用库存数量最多的位置

df_sample['loc_check'] = #Don't know how to do this part - if 'tid_dict' contains 'tid' = True
df_sample['inv_check'] = #Don't know how to do this part - if 'tid' = 'tid_dict' key with greater value = True
因此,最后我希望数据帧如下所示:

column_names = ["pid", "tid", "tid_dict", 'loc_check', 'inv_check']
data = [['p26CE0DEAC1', 't29', {'t29': 50, 't121': 41, 't140': 33}, True, True], ['p5505CB1A96', 't121', {'t156': 48}, False, False], ['p1B9E6A73EC', 't256',{}, False, False]]

df_sample = pd.DataFrame(data, columns = column_names)
感谢您的帮助。对不起,如果有什么不清楚的地方。我是一个爱好者,仍然开始学习python和pandas

跟进:

column_names = ["pid", "tid", "tid_dict"]
data = [['p26CE0DEAC1', 't121', {'t29': 50, 't121': 50, 't140': 33}], ['p5505CB1A96', 't121', {'t156': 48}], ['p1B9E6A73EC', 't256',{}]]

df_sample = pd.DataFrame(data, columns = column_names)
如何解释以下情况,即即使“t121”与位置“t29”具有相同数量的可用库存项目,下面的答案仍返回真/假?

您可以对这两个问题使用df.apply(lambda函数,axis=1)

代码 输出: 解释 此部分仅检查每一行的
tid
是否存在于
tid_dict
中,并将结果存储在列
loc_check

下一个比较复杂

df_sample['inv_check'] = df_sample.apply(lambda x:x['tid']==max(x['tid_dict'], key=x['tid_dict'].get) if x['tid_dict'] != {} else False, axis=1)
  • max(x['tid_dict'],key=x['tid_dict'].get)
    用于返回具有tid_dict中最大值的键

  • 然后使用
    x['tid']==max
    检查返回的密钥是否与'tid'相同

  • if检查只是为了防止字典为空时出错(如第三种情况)


谢谢你的回答。我发现了一个bug,我正试图找出它的原因。如果两个地点的库存项目数量相同,它有时会返回False。例如,如果“t121”有50个可用项目,“tid”最后变成“t121”,则当我希望它为真时,它返回一个假布尔值,即使另一个站点有相同数量的可用库存项目。哦,好的,那么您可以做的是获取dict中的最大值(应返回50),然后检查tid_dict[tid]=50。这应该可以修复bug,并在所有情况下都能正常工作
pid         tid     tid_dict                            loc_check   inv_check
p26CE0DEAC1 t29     {'t29': 50, 't121': 41, 't140': 33} True    True
p5505CB1A96 t121    {'t156': 48}                        False   False
p1B9E6A73EC t256    {}                                  False   False
df_sample['loc_check'] = df_sample.apply(lambda x: x['tid'] in x['tid_dict'], axis=1)
df_sample['inv_check'] = df_sample.apply(lambda x:x['tid']==max(x['tid_dict'], key=x['tid_dict'].get) if x['tid_dict'] != {} else False, axis=1)