【问题标题】:Python: Replacement not allowed with overlapping keys and values [duplicate]Python:不允许使用重叠的键和值进行替换[重复]
【发布时间】:2018-11-26 05:26:37
【问题描述】:

我正在尝试打乱输入数据帧中的值,将这些新值存储到字典中,然后通过将输入数据帧值替换为其字典映射来获取输出数据帧。

但是,我收到“不允许使用重叠的键和值替换”错误。

这是我的代码示例:

in_df = ['A','B','C']
in_df = pd.DataFrame(in_df,columns=['Alphabets'])
df_temp = in_df.sample(frac=1).reset_index(drop=True)
df_temp = df_temp.rename(columns={'Alphabets':'sample'})
mask_dict = dict(zip(in_df['Alphabets'], df_temp['sample']))
out_df= in_df.replace({'Alphabets': mask_dict})

in_df 如下所示:

Alphabets
A
B
C

mask_dict 看起来像这样:

{'A': 'C', 'B': 'A', 'C': 'C'}

我希望 out_df 看起来像这样:

Alphabets
C
A
C

我找到了办法!

df_temp = in_df.stack().unique()
df_temp = pd.DataFrame(df_temp, columns=['Alphabets'])
df_temp1 = df_temp.sample(n=df_temp.size, random_state=123)
mask_dict = dict(zip(df_temp['Alphabets'], df_temp1['Alphabets']))
out_df = in_df.applymap(mask_dict.get)

【问题讨论】:

  • replace 所做的是将每个替换按顺序应用于整个数据框——或者,当你给它一列时,整个系列。字典具有任意顺序。它可能会将所有As 替换为Cs,然后将所有Bs 替换为As,然后将所有Cs 替换为Cs,为您提供所需的输出,或者它可能首先替换所有Bs,然后是Cs,然后是As,给你所有Cs。
  • 更重要的是,您尝试将C 替换为C 这意味着您实际上并不是在寻找replace,而是在寻找通过字典映射值的东西,喜欢map
  • @abarnert,虽然这似乎是replace 的预期用途(和要求),但它是否记录在任何地方? docs 方法比较稀疏。
  • AFAIK,文档只是说它真的很复杂,所以你应该尝试一下,这……可能会更好。他们清楚地希望你能认出与str.replacere.sub 的相似之处(在多个地方提到过),但实际上并没有这么说。并且要了解 Pandas 中的所有其他方法,以便您可以通过消除过程来确定何时需要它……
  • @abarnert 我在这里使用字典的原因是因为我希望输出保持不变,在这种情况下 ['C','A','C'],无论多少次我运行代码。使用地图,我将不断获得每次运行的随机输出。我希望随机生成字典,但希望使用字典为每次运行获取相同的输出数据帧。

标签: python python-3.x pandas


【解决方案1】:

虽然我无法解释您的错误,但您可以改用 pd.DataFrame.applymap

out_df = in_df.applymap(mask_dict.get)

这种方法也应该比pd.DataFrame.replace 更有效,后者在与字典一起使用时会产生很大的开销。

如果只需要替换单个系列中的值,可以使用pd.Series.map

out_df = in_df.copy()
out_df['Alphabets'] = out_df['Alphabets'].map(mask-dict)

相关:Replace values in a pandas series via dictionary efficiently

【讨论】:

  • 无论我运行多少次代码,我都希望输出保持不变,在本例中为 ['C','A','C']。使用地图,我将不断获得每次运行的随机输出。我希望随机生成字典,但想使用字典为每次运行获取相同的输出数据帧。
  • I want the dictionary to be generated randomly, but want to use the dictionary to get the same output dataframe for each run. 你的说法自相矛盾。如果你的字典改变了,你的输出也会改变。
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 2015-04-24
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多