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