【问题标题】:Assign a Dictionary Value to a DataFrame Column Based on Dictionary Key根据字典键将字典值分配给 DataFrame 列
【发布时间】:2019-01-23 16:14:33
【问题描述】:

我正在寻找 map 字典中的 value 到 DataFrame 中的一列,其中字典中的 key 等于该 DataFrame 中的第二列

例如:

如果我的字典是:

dict = {'abc':'1/2/2003', 'def':'1/5/2017', 'ghi':'4/10/2013'}

我的数据框是:

      Member    Group      Date
 0     xyz       A         np.Nan
 1     uvw       B         np.Nan
 2     abc       A         np.Nan
 3     def       B         np.Nan
 4     ghi       B         np.Nan

我想得到以下内容:

      Member    Group      Date
 0     xyz       A         np.Nan
 1     uvw       B         np.Nan
 2     abc       A         1/2/2003
 3     def       B         1/5/2017
 4     ghi       B         4/10/2013

注意:dict 并不包含 df 中“成员”下的所有值。如果我映射,我不希望将这些值转换为 np.Nan。所以我想我必须做一个fillna(df['Member']) 来保留它们?


Remap values in pandas column with a dict, preserve NaNs 不同,它映射字典中的值以替换包含与字典中的键等效的 a 值的列。这是关于根据键值将 dict 值添加到 DataFrame 中的另一列。

【问题讨论】:

  • simply df['Date'] = df.Member.map(d) 注意,你不应该将字典命名为 dict ,因为它在 Python 中有特殊的含义。见Pandas.Series.map
  • 根据Not a duplicate,在功能上没有区别。您的专栏似乎完全是NaN,所以它基本上没有任何信息。默认情况下,.map 返回 NaN 如果对于键不在字典中的映射,那么只需映射并完全覆盖您的 Date 列。另一方面,如果您只想将Date 中的值替换为字典中的键(例如Date 并不总是为空的情况,那么您可以只使用.replace(d) 而不是.map(d)。两者包含在该副本中。

标签: python pandas dataframe dictionary


【解决方案1】:

如果Member 是您的索引,您可以为DataFrame 分配一个系列:

df.set_index("Member", inplace=True)
df["Date"] = pd.Series(dict)

Pandas 会将 Series 的索引与 DataFrame 的索引进行匹配。

【讨论】:

    【解决方案2】:

    我会做一个简单的地图来得到答案。

    如果我们有一个字典

    d = {abc:1/2/2003, def:1/5/2017, ghi:4/10/2013}
    

    数据框为:

          Member    Group      Date
    
     0     xyz       A         np.Nan
     1     uvw       B         np.Nan
     2     abc       A         np.Nan
     3     def       B         np.Nan
     4     ghi       B         np.Nan
    

    那么一个简单的地图就可以解决问题了。

    df["Date"] = df["Member"].map(d)
    

    map() 将在字典中查找df['Member'] 中的值,对于Member 中的每个值,它将从字典d 中获取值并将其分配回Date。如果该值不存在,它将分配NaN

    我们不需要循环或应用。

    【讨论】:

      【解决方案3】:

      只需创建一个新的 df 然后加入他们:

      map_df = pd.DataFrame(list(zip(map_dict.items()))).set_index(0)
      df.merge(map_df, how='left', left_on='Member', right_index=True)
      

      【讨论】:

        【解决方案4】:

        您可以使用df.apply 来解决您的问题,其中d 是您的字典。

        df["Date"] = df["Member"].apply(lambda x: d.get(x))
        

        这段代码的作用是获取Member 列中的每个值,并在您的字典中查找该值。如果在字典中找到该值,则相应的字典值将填充该列。如果该值不在字典中,则返回 None

        另外,请确保您的字典包含有效的数据类型。在您的字典中,键(abc、def、ghi)应表示为字符串,您的日期应表示为字符串或日期对象。

        【讨论】:

        • 谢谢。你可以参考阅读get吗?不熟悉。
        • dict 数据结构上的方法。从 getNone 默认或传递值中传递的键返回值。在核心 Python 文档中。
        【解决方案5】:
        for i in range(len(df)):
            if df['Member'][i] in d:
                df['Date'][i] = d[df['Member'][i]]
        

        附:用保留字(即 dict)命名变量是不好的做法。

        【讨论】:

          猜你喜欢
          • 2021-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          • 2021-10-25
          • 2021-04-15
          • 1970-01-01
          相关资源
          最近更新 更多