如何处理Pandas数据框'Ages'列的字符串数组并提取最大值?
问题描述
我有一个名为new_df的Pandas数据框,其中Ages列的每个元素都是字符串组成的数组。生成该数据框的代码如下:
df = train_cases[train_cases['Family_name'].duplicated(keep = False)] new_df = pd.DataFrame({'Ages' : df.groupby(df['Family_name'])['Age'].transform(lambda x: '| '.join(x.astype(str))), 'Names' : df.groupby(df['Family_name'])['Name'].transform(lambda x: '| '.join(x)), 'Family_name' : df['Family_name'] }) new_df['Ages'] = new_df['Ages'].apply(lambda x: x.split('| ')) new_df['Names'] = new_df['Names'].apply(lambda x: x.split('| ')) new_df.head(10)
train_cases是读取Kaggle泰坦尼克号竞赛CSV文件生成的数据框,代码如下:
def fam_name(name): return name.split(',')[0] train_cases = pd.read_csv("/.../train.csv") train_cases = train_cases.dropna(subset = ['PassengerId','Pclass','Sex','Age','SibSp','Parch','Fare'],how = "any") train_cases['Family_name'] = train_cases['Name'].apply(lambda x: fam_name(x))
我希望将Ages列中每个列表的元素转换为数值类型(整数或浮点数),并提取每个列表的最大值。尝试了以下代码但未得到正确结果:
max_val = 0 for x in new_df['Ages']: for ind, y in enumerate(x): if float(y) > max_val: max_val = float(y) max_index = ind print(max_val, max_index)
解决方案
你的循环代码问题在于max_val是全局变量,会持续记录所有列表中的最大值,而非每个单独列表的最大值。以下是几种更高效的实现方式:
方法1:使用apply结合列表推导式
直接对Ages列的每个列表做类型转换后取最大值,代码简洁直观:
# 转换每个列表元素为浮点数并提取最大值 new_df['Max_Age'] = new_df['Ages'].apply(lambda lst: max(float(age) for age in lst))
方法2:使用explode+groupby(适合大规模数据)
如果数据量较大,apply的效率可能偏低,可通过展开列表再分组计算的方式优化:
# 展开Ages列的列表,保留原索引 expanded_df = new_df['Ages'].explode().astype(float).reset_index() # 按原索引分组取最大值,合并回原数据框 new_df['Max_Age'] = expanded_df.groupby('index')[0].max()
方法3:优化循环代码
如果坚持使用循环,需在处理每个新列表时重置最大值变量:
max_ages = [] for age_list in new_df['Ages']: current_max = 0.0 for age_str in age_list: age = float(age_str) if age > current_max: current_max = age max_ages.append(current_max) new_df['Max_Age'] = max_ages
内容的提问来源于stack exchange,提问作者Zuni
相关产品推荐
相关产品推荐

