Pandas:用for循环与.loc创建新列时,新列值均为最后元素长度
问题原因
你循环里的df_marks['geometry']=len(std)会每次覆盖整个列,把所有行的geometry值都改成当前std的长度,循环结束后自然只剩最后一个元素的长度。要实现每行对应names元素的长度,得用.loc定位到对应行再赋值。
修正后的for循环写法
import pandas as pd mydictionary = {'names': ['Somuli', 'Kiu', 'mol', 'Lixxxx'], 'physics': [68, 74, 77, 78], 'chemistry': [84, 56, 73, 69], 'algebra': [78, 88, 82, 87]} df_marks = pd.DataFrame(mydictionary) print('Original DataFrame\n--------------') print(df_marks) # 初始化新列为数值类型,比空字符串更合理 df_marks['geometry'] = 0 print('\n\n DataFrame after adding "geometry" column\n--------------') # 遍历每行的索引和对应的name值 for idx, name in df_marks['names'].items(): # 用.loc定位到当前行的geometry列,赋值为当前name的长度 df_marks.loc[idx, 'geometry'] = len(name) print(df_marks)
更高效的Pandas原生写法
Pandas不推荐用循环处理行数据,数据量大时效率极低。直接用str.len()矢量化操作可以一键生成目标列,代码更简洁:
import pandas as pd mydictionary = {'names': ['Somuli', 'Kiu', 'mol', 'Lixxxx'], 'physics': [68, 74, 77, 78], 'chemistry': [84, 56, 73, 69], 'algebra': [78, 88, 82, 87]} df_marks = pd.DataFrame(mydictionary) # 直接生成每个name的长度列 df_marks['geometry'] = df_marks['names'].str.len() print(df_marks)
内容的提问来源于stack exchange,提问作者Sagar Rawal
相关产品推荐
相关产品推荐

