【问题标题】:matching dictionary values with values in a list within a dataframe将字典值与数据框中列表中的值匹配
【发布时间】:2014-09-09 22:45:26
【问题描述】:

我有一个带有列的数据框,相关的是 ID 和名称。我还有一本配对 ID:name 的字典。我需要匹配 ID 并将名称输出到 df['name'] 列。我遇到的问题是,在数据框中,某些 ID 每行有多个 ID。如何分别遍历每个 ID。

我的代码如下。如果只有一个 ID,它就可以工作。如果有多个 ID,我无法弄清楚如何让它工作。我猜它会被视为子列表?

for id_col, name_col in dic1.iteritems():
    df.loc[(df['ID Value'] == id_col), 'name'] = name_col

示例数据框:

df_test = pd.DataFrame( {'ID Value' : [130, (12,45,100), 208], 'name' : ['','','']})

df_test >>

   ID Value           name
0  130
1  (12, 45, 100)
2  208

dic1:

 45 Joe 
130 Andy
208 Mary

我想要的结果是:

    ID Value       name
 0  130            Andy
 1  (12, 45, 100)  Joe
 2  208            Mary

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    我不确定将元组和数字混合作为 ID 有多大用处(也许将它们全部转换为元组是正确的解决方案?)。
    无论如何,您可以使用 apply 来做到这一点:

    In [11]: d = {45: "Joe", 130: "Andy", 208: "Mary"}
    
    In [12]: f_test['ID Value'].apply(lambda x: d.get(x) or next(d.get(y) for y in x if d.get(y)))
    Out[12]:
    0    Andy
    1     Joe
    2    Mary
    Name: ID Value, dtype: object
    

    apply 中的函数首先查看 ID 是否在字典中(元组不会),如果是,则继续,如果没有找到第一个。 .


    这可能值得成为一个适当的功能:

    def get_int_or_tuple(x, d=d):
        try:
            return d[x]
        except KeyError:  # hopefully that means it's iterable!
            for y in x:
                if y in d:
                    return d[y]
    
    In [21]: f_test['ID Value'].apply(get_int_or_tuple)
    Out[21]:
    0    Andy
    1     Joe
    2    Mary
    Name: ID Value, dtype: object
    

    【讨论】:

      【解决方案2】:

      这将按预期输出结果,但请记住,对于元组中具有多个 id 的情况,您只需分配一个名称。

      import pandas as pd
      
      dic = {"Joe" : 45, "Andy" : 130, "Mary" : 208}
      
      df = pd.DataFrame( {'ID Value' : [130, (12,45,100), 208], 'name' : ['','','']})
      
      def getKey(match, dict):
          for key, value in dict.iteritems():
              if value == match:
                  return key
      
      for row in range(0, len(df)):
          ids = df['ID Value'][row]
      
          if isinstance(ids, int):
              name = getKey(ids, dic)
              if name != None:
                  df['name'][row] = name
          elif isinstance(ids, tuple):
              for id in ids:
                  name = getKey(id, dic)
                  if name != None:
                      df['name'][row] = name
      
      print(df)
              ID Value  name
      0            130  Andy
      1  (12, 45, 100)   Joe
      2            208  Mary
      
      [3 rows x 2 columns]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 2020-08-03
        • 2019-08-05
        • 2020-09-10
        • 2022-08-19
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多