繁体   English   中英

Python pandas:交换 DataFrame 切片的列值

[英]Python pandas: swap column values of a DataFrame slice

我有一个 DataFrame 像:

df = pd.DataFrame({"type":['pet', 'toy', 'toy', 'car'], 'symbol': ['A', 'B', 'C', 'D'], 'desc': [1, 2, 3, 4]})
df
Out[22]: 
  type symbol  desc
0  pet      A     1
1  toy      B     2
2  toy      C     3
3  car      D     4

我的目标是为typetoy的行交换symboldesc的值:

  type symbol  desc
0  pet      A     1
1  toy      2     B     # <-- B and 2 are swapped
2  toy      3     C     # <-- C and 3 are swapped
3  car      D     4

所以我要先取一个切片,然后在切片上进行交换,但失败了。 我的脚本、警告和结果是:

df[df['type']=='toy'][['symbol', 'desc']] = df[df['type']=='toy'][['desc', 'symbol']]
/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py:3191: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self[k1] = value[k2]
df
Out[31]: 
  type symbol  desc
0  pet      A     1
1  toy      B     2    # <-- didn't work  :(
2  toy      C     3
3  car      D     4

有什么建议吗?

让我们做

m = df.type=='toy'
l = ['symbol','desc']
df.loc[m,l] = df.loc[m,l[::-1]].values
df
Out[89]: 
  type symbol desc
0  pet      A    1
1  toy      2    B
2  toy      3    C
3  car      D    4

或尝试rename

m = df.type=='toy'
l = ['symbol','desc']

out = pd.concat([df[~m],df[m].rename(columns=dict(zip(l,l[::-1])))]).sort_index()

让我们尝试一下:

import pandas as pd

df = pd.DataFrame(
    {"type": ['pet', 'toy', 'toy', 'car'], 'symbol': ['A', 'B', 'C', 'D'],
     'desc': [1, 2, 3, 4]})

m = df['type'] == 'toy'

df.loc[m, ['symbol', 'desc']] = df.loc[m, ['desc', 'symbol']].to_numpy()
print(df)

Output:

  type symbol desc
0  pet      A    1
1  toy      2    B
2  toy      3    C
3  car      D    4

使用to_numpy() / values来防止列与其旧列名匹配。

您还可以使用 pandas 其中:

df[['symbol', 'desc']] = df[['desc', 'symbol']].where(df['type'] == 'toy',
                                                      df[['symbol', 'desc']].values)

Output:

    type  symbol  desc
0    pet       A     1
1    toy       2     B
2    toy       3     C
3    car       D     4

您还可以使用list(zip(...))

m = df['type']=='toy'
df.loc[m, ['symbol', 'desc']] = list(zip(df.loc[m, 'desc'], df.loc[m, 'symbol']))

或者干脆使用.values

m = df['type']=='toy'
df.loc[m, ['symbol', 'desc']] = df.loc[m, ['desc', 'symbol']].values

结果:

print(df)

  type symbol desc
0  pet      A    1
1  toy      2    B
2  toy      3    C
3  car      D    4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM