我有一个要与pandas df
的列匹配的值列表,然后想创建一个将列表值作为键的字典,然后将字典值从另一个列数据框。
这是我的清单:
sample_list = [101,105,112]
我的数据框:
sample_df = pd.DataFrame([[101, "NJ"], [105, "CA"],[111, "MO"], [101, "NJ"], [112, "NB"], [101, "NJ"], [105, "CA"]], \
columns=["Col1", "Col2"])
看起来像这样
Col1 Col2
0 101 NJ
1 105 CA
2 111 MO
3 101 NJ
4 112 NB
5 101 NJ
6 105 CA
现在,我正在尝试迭代列表值(它们是我的new_dict
的键),并将其与Col1
匹配,如果它们匹配,我想提取Col2
值作为我的值字典值。到目前为止,这就是我的代码,
new_dict = {}
for value in sample_list:
for i in sample_df['Col1']:
if value == i:
new_dict[value] = [i for i in sample_df['Col2']]
但是,我的new_dict
看起来像这样,
{101: ['NJ', 'CA', 'MO', 'NJ', 'NB', 'NJ', 'CA'],
105: ['NJ', 'CA', 'MO', 'NJ', 'NB', 'NJ', 'CA'],
112: ['NJ', 'CA', 'MO', 'NJ', 'NB', 'NJ', 'CA']}
我需要这样的输出
{101: ['NJ'],
105: ['CA'],
112: ['NB']}
如何获得所需的输出?任何帮助都很好。
答案 0 :(得分:3)
这可以做到:
new_dict = {i: [sample_df[sample_df['Col1']==i]['Col2'].values[0]] for i in sample_list}
答案 1 :(得分:1)
如果您坚持认为这是另一种解决方案,则应该使用isin()
创建用于过滤掉不需要的行的掩码来提高效率。
m = sample_df['Col1'].isin(sample_list)
sample_df[m].drop_duplicates().groupby('Col1')['Col2'].apply(list).to_dict()
返回:{101: ['NJ'], 105: ['CA'], 112: ['NB']}
注意:如果还有更多非唯一的连击,它们也会出现在列表中。使用:{k:[v] for k,v in sample_df[m].groupby('Col1')['Col2'].first().items()}
(如果您只想要第一个)。
如果要使用列表项,但又不是全部,为什么不只是值?
m = sample_df['Col1'].isin(sample_list)
sample_df[m].set_index('Col1')['Col2'].to_dict()
返回:{101: 'NJ', 105: 'CA', 112: 'NB'}
或(如果需要所有项目):
m = sample_df['Col1'].isin(sample_list)
sample_df[m].groupby('Col1')['Col2'].apply(list).to_dict()
返回:{101: ['NJ', 'NJ', 'NJ'], 105: ['CA', 'CA'], 112: ['NB']}