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


所有评论(0)