根据字典键将字典值分配给 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 中的另一列。
【问题讨论】:
simplydf['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
数据结构上的方法。从 get
或 None
默认或传递值中传递的键返回值。在核心 Python 文档中。【参考方案5】:
for i in range(len(df)):
if df['Member'][i] in d:
df['Date'][i] = d[df['Member'][i]]
附:用保留字(即 dict)命名变量是不好的做法。
【讨论】:
以上是关于根据字典键将字典值分配给 DataFrame 列的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:根据另一列的键在现有列上映射字典值以替换 NaN
从两个熊猫系列(csv的列作为DataFrame)创建元素字典