Python 基于具有字典值的列在Dataframe中添加列
我有一个名为df_sample的数据帧。它包含三列。第一列(“pid”)是项目的标识号。第二列(“did”)是项目所在位置的标识。第三列(“tid_dict”)是一本词典,其中列出了物品应该来自何处,以及该地点有多少库存物品 我想检查(A)物品实际来自其应来自的位置之一的频率,以及(B)物品是否来自数量最大的位置。更复杂的是,有时项目无法从任何位置找到,有时它来自预期之外的其他地方。以下内容设置了一个示例数据帧:Python 基于具有字典值的列在Dataframe中添加列,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个名为df_sample的数据帧。它包含三列。第一列(“pid”)是项目的标识号。第二列(“did”)是项目所在位置的标识。第三列(“tid_dict”)是一本词典,其中列出了物品应该来自何处,以及该地点有多少库存物品 我想检查(A)物品实际来自其应来自的位置之一的频率,以及(B)物品是否来自数量最大的位置。更复杂的是,有时项目无法从任何位置找到,有时它来自预期之外的其他地方。以下内容设置了一个示例数据帧: import pandas as pd column_names = [&quo
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)
用于返回具有tid_dict中最大值的键max(x['tid_dict'],key=x['tid_dict'].get)
- 然后使用
检查返回的密钥是否与'tid'相同x['tid']==max
- if检查只是为了防止字典为空时出错(如第三种情况)
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)