Pandas提取DataFrame中Region对应Name时出现单字符拆分问题
问题描述
从Pandas DataFrame中提取Region列的唯一值并获取对应Name列数据时,出现异常:当某一Region仅对应一个Name时,该Name会被拆分为单个字符输出(比如linda被拆成l-i-n-d-a)。
相关代码
import pandas as pd data = { 'Region': ['South','West', 'North','West', 'North', 'South','West', 'North', 'East'], 'Name': ['Tom', 'nick', 'krish', 'jack','peter','sam','jon','megan','linda'] } df = pd.DataFrame(data) list_region = df['Region'].unique().tolist() for region in list_region: list_person = df.set_index('Region').loc[region, 'Name'] for person in list_person: print(region + ' >> ' + person)
异常输出示例
North >> megan East >> l East >> i East >> n East >> d East >> a
问题原因
当某个Region只对应一条数据时,df.set_index('Region').loc[region, 'Name']返回的不是Series类型,而是单个字符串对象。遍历字符串时,Python会默认按单个字符拆分,导致输出每个字符。
解决方案
方案1:强制返回Series类型
将region放在列表中传入loc,确保即使只有一条数据,也返回Series对象,遍历的时候就能拿到完整的Name值:
import pandas as pd data = { 'Region': ['South','West', 'North','West', 'North', 'South','West', 'North', 'East'], 'Name': ['Tom', 'nick', 'krish', 'jack','peter','sam','jon','megan','linda'] } df = pd.DataFrame(data) list_region = df['Region'].unique().tolist() for region in list_region: # 把region包装成列表,确保返回Series list_person = df.set_index('Region').loc[[region], 'Name'] for person in list_person: print(region + ' >> ' + person)
方案2:用groupby分组处理(更简洁)
直接按Region分组,获取每个组的Name列表,从根源避免类型问题:
import pandas as pd data = { 'Region': ['South','West', 'North','West', 'North', 'South','West', 'North', 'East'], 'Name': ['Tom', 'nick', 'krish', 'jack','peter','sam','jon','megan','linda'] } df = pd.DataFrame(data) # 按Region分组,提取每组的Name列表 grouped = df.groupby('Region')['Name'].apply(list) for region, names in grouped.items(): for name in names: print(f"{region} >> {name}")
方案3:判断返回值类型
如果要保留原逻辑,可通过判断list_person的类型,单独处理字符串情况:
import pandas as pd data = { 'Region': ['South','West', 'North','West', 'North', 'South','West', 'North', 'East'], 'Name': ['Tom', 'nick', 'krish', 'jack','peter','sam','jon','megan','linda'] } df = pd.DataFrame(data) list_region = df['Region'].unique().tolist() for region in list_region: list_person = df.set_index('Region').loc[region, 'Name'] # 若为字符串则直接输出,否则遍历Series if isinstance(list_person, str): print(region + ' >> ' + list_person) else: for person in list_person: print(region + ' >> ' + person)
内容的提问来源于stack exchange,提问作者Guardian Linda
相关产品推荐
相关产品推荐

