代码之家  ›  专栏  ›  技术社区  ›  i.n.n.m

从DF栏中插入数值到大熊猫(Python)

  •  1
  • i.n.n.m  · 技术社区  · 8 年前

    我有一个值列表,我正试图与熊猫列相匹配 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']]
    

    但是,我的 新的 看起来像这样,

    {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 回复  |  直到 8 年前
        1
  •  3
  •   rahlf23    8 年前

    这样做:

    new_dict = {i: [sample_df[sample_df['Col1']==i]['Col2'].values[0]] for i in sample_list}
    
        2
  •  1
  •   Anton vBR    8 年前

    备选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'}


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