Pandas如何基于Mobile_phone列值复制行并替换Work_phone列内容
实现方案
整体逻辑分4步:
- 筛选出
Mobile_phone列为有效值的行 - 复制上述行,将复制行的
Work_phone值替换为原行的Mobile_phone值 - 合并原数据与复制得到的新行,按原行顺序排序保证原行在前、对应新行在后
- 清空所有行的
Mobile_phone列内容
通用实现代码
如果你已经通过pd.read_csv读入数据存为df,可以直接使用以下代码:
import pandas as pd # 1、定义有效值判断规则,可根据实际数据的空值占位符调整 has_valid_mobile = df['Mobile_phone'].notna() & (df['Mobile_phone'].astype(str).str.strip() != '') # 2、生成要追加的新行 new_rows = df[has_valid_mobile].copy() new_rows['Work_phone'] = new_rows['Mobile_phone'] # 3、合并原数据和新行,调整顺序和示例一致 df['temp_sort1'] = df.index df['temp_sort2'] = 0 new_rows['temp_sort1'] = new_rows.index new_rows['temp_sort2'] = 1 df_final = pd.concat([df, new_rows], ignore_index=True) df_final = df_final.sort_values(['temp_sort1', 'temp_sort2']).drop(columns=['temp_sort1', 'temp_sort2']) # 4、清空所有行的Mobile_phone列 df_final['Mobile_phone'] = ''
完整可运行测试代码
对应你给出的示例数据,可以直接运行验证效果:
import pandas as pd # 构造示例初始数据 data = { 'Full name': ['Amanda Brown', 'Bert Sutherland', 'Charlie Chaplin', 'Derek Simpson'], 'Work_phone': ['1234567896', '1234567897', '1234567898', '1234567899'], 'Mobile_phone': ['77895641225', '', '', '77895641228'], 'Company': ['A company', 'B company', 'C company', 'D company'] } df = pd.DataFrame(data) # 执行处理逻辑 has_valid_mobile = df['Mobile_phone'].notna() & (df['Mobile_phone'].astype(str).str.strip() != '') new_rows = df[has_valid_mobile].copy() new_rows['Work_phone'] = new_rows['Mobile_phone'] df['temp_sort1'] = df.index df['temp_sort2'] = 0 new_rows['temp_sort1'] = new_rows.index new_rows['temp_sort2'] = 1 df_final = pd.concat([df, new_rows], ignore_index=True) df_final = df_final.sort_values(['temp_sort1', 'temp_sort2']).drop(columns=['temp_sort1', 'temp_sort2']) df_final['Mobile_phone'] = '' # 打印结果 print(df_final)
如果不需要严格匹配示例的行排序,只需要保证数据正确,可以去掉临时排序列的相关逻辑,合并后直接重置索引即可。
内容的提问来源于stack exchange,提问作者nic_s
相关产品推荐
相关产品推荐

