【发布时间】: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.replace和re.sub的相似之处(在多个地方提到过),但实际上并没有这么说。并且要了解 Pandas 中的所有其他方法,以便您可以通过消除过程来确定何时需要它…… -
@abarnert 我在这里使用字典的原因是因为我希望输出保持不变,在这种情况下 ['C','A','C'],无论多少次我运行代码。使用地图,我将不断获得每次运行的随机输出。我希望随机生成字典,但希望使用字典为每次运行获取相同的输出数据帧。
标签: python python-3.x pandas