Python pandas DataFrame交换两列数据

Python pandas DataFrame交换两列数据

列名也互换,非交换列顺序保持不变。

1、方法一:使用reindex

swap_col:传入要交换的列名

swap_df_col:传入要交换的列位置(列号)

最终使用reindex方法实现

import pandas as pd


# 两列数据与列名互换
def swap_df_col(idf: pd.DataFrame, colnum_a: int, colnum_b: int):
    if 0 <= colnum_a <= len(idf.columns) and 0 <= colnum_b <= len(idf.columns):
        idf_copy = idf.copy()
        list_cols = idf_copy.columns.tolist()
        list_cols[colnum_a], list_cols[colnum_b] = list_cols[colnum_b], list_cols[colnum_a]
        return idf_copy.reindex(columns=list_cols)
    else:
        return idf


def swap_col(idf: pd.DataFrame, colname_a: str, colname_b: str):
    if not isinstance(idf, pd.DataFrame):
        return idf
    if colname_a in idf.columns and colname_b in idf.columns:
        return swap_df_col(idf, idf.columns.get_loc(colname_a), idf.columns.get_loc(colname_b))
    else:
        return idf


if __name__ == '__main__':
    data = [['小太阳', 10, 20], ['鼠标', 21, 31], ['小刀', 51, 81]]
    columns = ['名称', '单价', '数量']
    df = pd.DataFrame(data=data, columns=columns)
    print(df)

    print('=' * 60, '方法一')
    df_swap = swap_col(df, '数量', '单价')
    print(df_swap)

打印结果:

    名称  单价  数量
0  小太阳  10  20
1   鼠标  21  31
2   小刀  51  81
============================================================ 方法一
    名称  数量  单价
0  小太阳  20  10
1   鼠标  31  21
2   小刀  81  51

2、方法二:

获取DataFrame列的列表,交换列的顺序。

import pandas as pd


# 两列数据与列名互换
# 自定义函数,交换列表两个位置的元素
def swap_data(ilist, idx_a, idx_b):
    if type(ilist) != list:
        return ilist
    if 0 <= idx_a <= len(ilist) and idx_b >= 0 and idx_b <= len(ilist) and idx_a != idx_b:
        ilist[idx_a], ilist[idx_b] = ilist[idx_b], ilist[idx_a]
        return ilist
    else:
        return ilist


def swap_col2(idf: pd.DataFrame, colname_a: str, colname_b: str):
    if not isinstance(idf, pd.DataFrame):
        return idf
    if colname_a in idf.columns and colname_b in idf.columns:
        idf_copy = idf.copy()
        int_colnum_a = idf_copy.columns.get_loc(colname_a)
        int_colnum_b = idf_copy.columns.get_loc(colname_b)
        list_cols = swap_data(idf_copy.columns.tolist(), int_colnum_b, int_colnum_a)
        idf_copy = idf_copy[list_cols]
        return idf_copy
    else:
        return idf


if __name__ == '__main__':
    data = [['小太阳', 10, 20], ['鼠标', 21, 31], ['小刀', 51, 81]]
    columns = ['名称', '单价', '数量']
    df = pd.DataFrame(data=data, columns=columns)
    print(df)

    print('=' * 60, '方法二')
    df_swap = swap_col2(df, '数量', '单价')
    print(df_swap)

打印结果:

    名称  单价  数量
0  小太阳  10  20
1   鼠标  21  31
2   小刀  51  81
============================================================ 方法二
    名称  数量  单价
0  小太阳  20  10
1   鼠标  31  21
2   小刀  81  51

3、方法三:

与方法二类似

import pandas as pd


def swap_col3(idf: pd.DataFrame, colname_a: str, colname_b: str):
    if not isinstance(idf, pd.DataFrame):
        return idf
    if colname_a in idf.columns and colname_b in idf.columns:
        idf_copy = idf.copy()
        list_cols = list(idf_copy.columns)
        int_colnum_a = idf_copy.columns.get_loc(colname_a)
        int_colnum_b = idf_copy.columns.get_loc(colname_b)
        # 重排列的顺序
        list_cols.insert(int_colnum_b, list_cols.pop(list_cols.index(colname_a)))
        list_cols.insert(int_colnum_a, list_cols.pop(list_cols.index(colname_b)))
        idf_copy = idf_copy.loc[:, list_cols]
        return idf_copy
    else:
        return idf

# 两列数据与列名互换
if __name__ == '__main__':
    data = [['小太阳', 10, 20], ['鼠标', 21, 31], ['小刀', 51, 81]]
    columns = ['名称', '单价', '数量']
    df = pd.DataFrame(data=data, columns=columns)
    print(df)

    print('=' * 60, '方法三')
    df_swap = swap_col3(df, '名称', '数量')
    print(df_swap)


打印结果:

    名称  单价  数量
0  小太阳  10  20
1   鼠标  21  31
2   小刀  51  81
============================================================ 方法三
   数量  单价   名称
0  20  10  小太阳
1  31  21   鼠标
2  81  51   小刀

4、方法四:先交换列数据,再rename改列名

import pandas as pd


def swap_col4(idf: pd.DataFrame, colname_a: str, colname_b: str):
    if not isinstance(idf, pd.DataFrame):
        return idf
    if colname_a in idf.columns and colname_b in idf.columns:
        idf_copy = idf.copy()
        # idf_copy[[colname_b, colname_a]] = idf_copy[[colname_a, colname_b]] #方法一
        # 方法二,不加to_numpy()实现不了
        idf_copy.loc[:, [colname_b, colname_a]] = idf_copy.loc[:, [colname_a, colname_b]].to_numpy()
        idf_copy.rename(columns={colname_a: colname_b, colname_b: colname_a}, inplace=True)
        return idf_copy
    else:
        return idf


# 两列数据与列名互换
if __name__ == '__main__':
    data = [['小太阳', 10, 20], ['鼠标', 21, 31], ['小刀', 51, 81]]
    columns = ['名称', '单价', '数量']
    df = pd.DataFrame(data=data, columns=columns)
    print(df)

    print('=' * 60, '方法四')
    df_swap = swap_col4(df, '名称', '数量')
    print(df_swap)

打印结果:

    名称  单价  数量
0  小太阳  10  20
1   鼠标  21  31
2   小刀  51  81
============================================================ 方法四
   数量  单价   名称
0  20  10  小太阳
1  31  21   鼠标
2  81  51   小刀

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值