根据字典键将字典值分配给 DataFrame 列

Posted

技术标签:

【中文标题】根据字典键将字典值分配给 DataFrame 列【英文标题】:Assign a Dictionary Value to a DataFrame Column Based on Dictionary Key 【发布时间】: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)。两者包含在该副本中。 【参考方案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)命名变量是不好的做法。

【讨论】:

以上是关于根据字典键将字典值分配给 DataFrame 列的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas Dataframe 列映射到字典值

Pandas:根据另一列的键在现有列上映射字典值以替换 NaN

从两个熊猫系列(csv的列作为DataFrame)创建元素字典

python用两个键将带有行和列标题的csv文件读入字典

使用字符串和浮点数字典的 Pandas DataFrame 分配错误?

如何根据字典中的键/值增加 Python Pandas DataFrame