为了账号安全,请及时绑定邮箱和手机立即绑定

Python - 交换多个数据帧中的值

Python - 交换多个数据帧中的值

噜噜哒 2021-07-20 17:01:45
我有一个像这样的 DataFrameid  val1   val20    A      B1    B      B2    A      A3    A      A我想要交换值,例如:id  val1   val20    B      A1    A      A2    B      B3    B      B我需要考虑 df 可能有我想保持不变的其他列。
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您可以使用pd.DataFrame.applymap字典:


d = {'B': 'A', 'A': 'B'}


df = df.applymap(d.get).fillna(df)


print(df)


  id val1 val2

0  0    B    A

1  1    A    A

2  2    B    B

3  3    B    B

为了性能,特别是内存使用,您可能希望使用分类数据:


for col in df.columns[1:]:

    df[col] = df[col].astype('category')

    df[col] = df[col].cat.rename_categories(d)


查看完整回答
反对 回复 2021-07-28
?
DIEA

TA贡献1820条经验 获得超2个赞

使用factorize并滚动相应的值


def swaparoo(col):

  i, r = col.factorize()

  return pd.Series(r[(i + 1) % len(r)], col.index)


df[['id']].join(df[['val1', 'val2']].apply(swaparoo))


   id val1 val2

0   0    B    A

1   1    A    A

2   2    B    B

3   3    B    B

替代体操使用相同的功能。这将整个数据帧合并到分解中。


df.set_index('id').stack().pipe(swaparoo).unstack().reset_index()

例子

df = pd.DataFrame(dict(id=range(4), val1=[*'ABAA'], val2=[*'BBAA']))


print(

    df,

    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),

    sep='\n\n'

)


   id val1 val2

0   0    A    B

1   1    B    B

2   2    A    A

3   3    A    A


   id val1 val2

0   0    B    A

1   1    A    A

2   2    B    B

3   3    B    B

df = pd.DataFrame(dict(id=range(4), val1=[*'AAAA'], val2=[*'BBBB']))


print(

    df,

    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),

    sep='\n\n'

)


   id val1 val2

0   0    A    B

1   1    A    B

2   2    A    B

3   3    A    B


   id val1 val2

0   0    B    A

1   1    B    A

2   2    B    A

3   3    B    A

df = pd.DataFrame(dict(id=range(4), val1=[*'AAAA'], val2=[*'BBBB'], val3=[*'CCCC']))


print(

    df,

    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),

    sep='\n\n'

)


   id val1 val2 val3

0   0    A    B    C

1   1    A    B    C

2   2    A    B    C

3   3    A    B    C


   id val1 val2 val3

0   0    B    C    A

1   1    B    C    A

2   2    B    C    A

3   3    B    C    A

df = pd.DataFrame(dict(id=range(4), val1=[*'ABCD'], val2=[*'BCDA'], val3=[*'CDAB']))


print(

    df,

    df.set_index('id').stack().pipe(swaparoo).unstack().reset_index(),

    sep='\n\n'

)


   id val1 val2 val3

0   0    A    B    C

1   1    B    C    D

2   2    C    D    A

3   3    D    A    B


   id val1 val2 val3

0   0    B    C    D

1   1    C    D    A

2   2    D    A    B

3   3    A    B    C


查看完整回答
反对 回复 2021-07-28
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信