从DF列中将值插入字典-Pandas(Python)

时间:2018-06-25 21:12:09

标签: python python-3.x list dictionary dataframe

我有一个要与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']}

如何获得所需的输出?任何帮助都很好。

2 个答案:

答案 0 :(得分:3)

这可以做到:

new_dict = {i: [sample_df[sample_df['Col1']==i]['Col2'].values[0]] for i in sample_list}

答案 1 :(得分:1)

Alt 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()}(如果您只想要第一个)。


替代2

如果要使用列表项,但又不是全部,为什么不只是值?

m = sample_df['Col1'].isin(sample_list)
sample_df[m].set_index('Col1')['Col2'].to_dict()

返回:{101: 'NJ', 105: 'CA', 112: 'NB'}


Alt 3

(如果需要所有项目):

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']}