如何在Pandas DataFrame中用\n换行且不拆分数据行
如何在Pandas DataFrame单元格内实现换行(不拆分数据行)
测试数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'KEY': [4507,211,5294,2233,2260], 'NAME':['kim young','laa eudong','kill gil','lee suk','No hee'], 'FIND_DATE':[20130518,20140626,20140215,20141121,20140910], 'EVENT_DTL':['A','B','C','D','E'] }) df.loc[:3,'EVENT_DTL'] = np.nan
需求说明
需要为EVENT_DTL列的NaN值填充多行文本,要求每个KEY对应的内容保留在同一单元格内,通过\n实现换行,不拆分数据行。
错误尝试代码
# 错误的填充方式 idx = df.EVENT_DTL.isna() df.loc[idx,'EVENT_DTL'] = ('1. 변사자 정보 : '+df.loc[idx,'NAME']+df.loc[idx,'FIND_DATE'].astype(str).str[:4]+'년'+df.loc[idx,'FIND_DATE'].astype(str).str[4:6]+'월'+' '+'\n3. 발견장소 : \n1) 수사기록 상 주소 \n주민등록상 주소 : ').str.split('\n') df = df.explode('EVENT_DTL')
错误输出结果
KEY EVENT_DTL 2143 4507 1. 변사자 정보 : kim young2013년05월 2143 4507 3. 발견장소 : 2143 4507 1) 수사기록 상 주소 2143 4507 주민등록상 주소 : 2386 211 1. 변사자 정보 : Laa euong2014년06월 2386 211 3. 발견장소 : 2386 211 1) 수사기록 상 주소 2386 211 주민등록상 주소 :
期望输出效果
KEY EVENT_DTL 2143 4507 1. 변사자 정보 : kim young2013년05월 3. 발견장소 : 1) 수사기록 상 주소 주민등록상 주소 : 2386 211 1. 변사자 정보 : Laa euong2014년06월 3. 발견장소 : 1) 수사기록 상 주소 주민등록상 주소 :
解决方案
1. 正确填充带换行符的文本
不需要将字符串拆分为列表,直接拼接包含\n的完整字符串赋值给目标列:
idx = df.EVENT_DTL.isna() df.loc[idx,'EVENT_DTL'] = ( '1. 변사자 정보 : ' + df.loc[idx,'NAME'] + df.loc[idx,'FIND_DATE'].astype(str).str[:4] + '년' + df.loc[idx,'FIND_DATE'].astype(str).str[4:6] + '월' + '\n3. 발견장소 : \n1) 수사기록 상 주소 \n주민등록상 주소 : ' )
2. 让换行效果可见
默认情况下Pandas可能不会显示换行,需要调整显示设置:
- 终端/控制台显示:设置最大列宽,让完整文本显示:
pd.set_option('display.max_colwidth', None)
此时输出时\n会被解析为换行,呈现出单元格内多行的效果。
- Jupyter Notebook显示:使用Styler设置文本自动换行样式,让换行效果更直观:
df.style.set_properties(**{'white-space': 'pre-wrap'})
原理说明
之前的错误在于使用str.split('\n')将字符串转为列表,再通过explode将列表元素拆分为多行。而实际需求是保留包含\n的字符串在单个单元格内,通过调整显示设置让换行符生效即可实现目标效果。
内容的提问来源于stack exchange,提问作者Chung Joshua
相关产品推荐
相关产品推荐

