使用字典在pandas列中重新映射值

我有一个字典,看起来像这样: di = {1: "A", 2: "B"}

我想将其应用于类似于以下内容的dataframe的“col1”列:

  col1 col2 0 wa 1 1 2 2 2 NaN 

要得到:

  col1 col2 0 wa 1 A 2 2 B NaN 

我怎么能最好的做到这一点? 出于某种原因,与此相关的Googlesearch条款仅向我显示了有关如何从字典创build列的链接,反之亦然: – /

你可以使用.replace 。 例如:

 >>> df = pd.DataFrame({'col2': {0: 'a', 1: 2, 2: np.nan}, 'col1': {0: 'w', 1: 1, 2: 2}}) >>> di = {1: "A", 2: "B"} >>> df col1 col2 0 wa 1 1 2 2 2 NaN >>> df.replace({"col1": di}) col1 col2 0 wa 1 A 2 2 B NaN 

或直接在Series ,即df["col1"].replace(di, inplace=True)

你的问题有一点含糊不清。 至less有三种解释:

  1. di的键是指索引值
  2. di的键是指df['col1']
  3. di的键是指索引位置(不是OP的问题,而是为了好玩而抛出)。

以下是每个案例的解决scheme。


情况1:如果di的键是为了引用索引值,那么你可以使用update方法:

 df['col1'].update(pd.Series(di)) 

例如,

 import pandas as pd import numpy as np df = pd.DataFrame({'col1':['w', 10, 20], 'col2': ['a', 30, np.nan]}, index=[1,2,0]) # col1 col2 # 1 wa # 2 10 30 # 0 20 NaN di = {0: "A", 2: "B"} # The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B' df['col1'].update(pd.Series(di)) print(df) 

产量

  col1 col2 1 wa 2 B 30 0 A NaN 

我修改了原始文章中的值,以便update更清晰。 请注意di中的键是如何与索引值关联的。 索引值的顺序 – 即索引位置 – 并不重要。


情况2:如果di的键指的是df['col1']值,那么@DanAllan和@DSM显示如何用replace来实现:

 import pandas as pd import numpy as np df = pd.DataFrame({'col1':['w', 10, 20], 'col2': ['a', 30, np.nan]}, index=[1,2,0]) print(df) # col1 col2 # 1 wa # 2 10 30 # 0 20 NaN di = {10: "A", 20: "B"} # The values 10 and 20 are replaced by 'A' and 'B' df['col1'].replace(di, inplace=True) print(df) 

产量

  col1 col2 1 wa 2 A 30 0 B NaN 

请注意,在这种情况下,如何将di中的键更改为与df['col1']中的匹配。


情况3:如果di的键是指索引位置,那么你可以使用

 df['col1'].put(di.keys(), di.values()) 

以来

 df = pd.DataFrame({'col1':['w', 10, 20], 'col2': ['a', 30, np.nan]}, index=[1,2,0]) di = {0: "A", 2: "B"} # The values at the 0 and 2 index locations are replaced by 'A' and 'B' df['col1'].put(di.keys(), di.values()) print(df) 

产量

  col1 col2 1 A a 2 10 30 0 B NaN 

在这里,第一行和第三行被改变了,因为di中的键是02 ,这与Python的基于0的索引是指第一和第三位置。

这是一个可供select的答案,当你的字典有多个键时,这个答案可以更快。 如果你的字典彻底地映射了所有可能的值,这需要一个非常简单的forms:

 df['col1'].map(di) # note: if the dictionary does not exhaustively map all # entries then non-matched entries are changed to NaNs 

尽pipemap最常用的是一个函数作为参数,但也可以采用一个字典或一系列的文档 : Pandas.series.map的文档

如果没有详尽的映射,则需要添加update ,以防止将不匹配项更改为NaN。

 df['col1'].update( df['col1'].map(di) ) # note: series update is an inplace operation 

下面是一个详细的案例在一个dataframe100,000行和8个字典键(约10倍快)的时间。

 di = {1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H" } df = pd.DataFrame({ 'col1': np.random.choice( range(1,9), 100000 ) }) %timeit df.replace({"col1": di}) 10 loops, best of 3: 55.6 ms per loop %timeit df['col1'].map(di) 100 loops, best of 3: 4.16 ms per loop