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、与方法2类似

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   小刀

5、直接重新赋值

df5 = df.copy()
df5['名称'], df5['数量'] = df5['数量'], df5['名称']
df5 = df.rename(columns={'名称': '数量', '数量': '名称'})
print(df5)

6、根据列名交换列

def swap_columns(idf, col1, col2):
    cols = list(idf.columns)
    idx1, idx2 = cols.index(col1), cols.index(col2)
    cols[idx1], cols[idx2] = cols[idx2], cols[idx1]
    return idf[cols]


df6 = swap_columns(df, '名称', '数量')

7、根据列位置交换列

# 直接交换列位置
col_positions = list(range(len(df.columns)))
# 假设交换第0列和第2列
col_positions[0], col_positions[2] = col_positions[2], col_positions[0]
df7 = df.iloc[:, col_positions]

8、使用pop与insert,不推荐,仅说明这是一种实现方式

# 第0与2列交换列,先删除列,然后在指定位置插入
df8 = df.copy()
col_b = df8.pop('数量')  # 删除数量列并保存
df8.insert(0, '数量', col_b)  # 将数量列插入到第0列的位置
col_c = df8.pop('名称')  # 删除名称列并保存
df8.insert(2, '名称', col_c)  # 将名称列插入到2列的位置
print(df8)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐