我有一个数据帧df1:

id1_a    id2_a   id3_a  id1_b    id2_b   id3_b
a1        a2       a3    b1        b2     b3
aa1       a2       a3    b12       b22    b23
ac1       c2       a3    bc2       bc2    bc3

我想将其用作字典来替换中id1\u a、id2\u a、id3\u a列中的值

此数据帧df2:

id1_a    id2_a   id3_a  
a1        a2       a3    
a1        a2       a3   
aa1       a2       a3    
ac1       c2       a3   

所以期望的结果是

id1_a    id2_a   id3_a  
b1        b2       b3   
b1        b2       b3
b12       b22      b23   
bc2       bc2      bc3  

我怎么能那样做?如果只有一列,我会将其转换为字典并替换值,但在三列的情况下该怎么办?

推荐答案

如果需要使用在_a_b列之间创建的字典替换所有列,请使用:

df1.columns = df1.columns.str.split('_', expand=True)
df1 = df1.stack(0)

df2 = df2.replace(dict(zip(df1['a'], df1['b'])))
print (df2)

  id1_a id2_a id3_a
0    b1   b22   bc3
1    b1   b22   bc3
2   b12   b22   bc3
3   bc2   bc2   bc3

如果需要替换为匹配列,请创建Series以首先指定它:

print (df1)
  id1_a id2_a id3_a id1_b id2_b id3_b
0    a1    a2    a3    b1    b2    b3
1   aa1    a1    a3   b12   b22   b23
2   ac1    c2    a3   bc2   bc2   bc3


print (df2)
  id1_a id2_a id3_a
0    b1   b22   bc3
1    b1    b2   bc3
2   b12    b2   bc3
3   bc2   bc2   bc3


df1.columns = df1.columns.str.split('_', expand=True)
s = (df1.stack(0)
        .groupby(level=1)
        .apply(lambda x: dict(zip(x['a'], x['b'])))
        .add_suffix('_a'))
print (s)
id1_a    {'a1': 'b1', 'aa1': 'b12', 'ac1': 'bc2'}
id2_a      {'a2': 'b2', 'a1': 'b22', 'c2': 'bc2'}
id3_a                               {'a3': 'bc3'}
dtype: object

df2 = df2.replace(s)
print (df2)
  id1_a id2_a id3_a
0    b1   b22   bc3
1    b1    b2   bc3
2   b12    b2   bc3
3   bc2   bc2   bc3

Python相关问答推荐

使用Python进行网页抓取,没有页面

在Docker中运行HAProxy时无法获得503服务

使用Beautiful Soup获取第二个srcset属性

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

Pandas 有条件轮班操作

如何标记Spacy中不包含特定符号的单词?

如何过滤包含2个指定子字符串的收件箱列名?

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

PyQt5,如何使每个对象的 colored颜色 不同?'

如何将多进程池声明为变量并将其导入到另一个Python文件

将JSON对象转换为Dataframe

提取相关行的最快方法—pandas

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

名为__main__. py的Python模块在导入时不运行'

用渐近模计算含符号的矩阵乘法

如何在PySide/Qt QColumbnView中删除列

从列表中获取n个元素,其中list [i][0]== value''

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

当条件满足时停止ODE集成?

pandas fill和bfill基于另一列中的条件