for循环追加DataFrame拼接原表时前4行正常后续返回NaN值
问题原因分析
- 核心错误出在循环逻辑的遍历对象设置错误:你当前的for循环遍历的是
isValidString(df_test.testresults.iloc[s])的返回值,初始化s=0时,这个返回值是第一行数据处理后得到的字典,字典默认迭代键,你返回的字典刚好有4个键(is_valid、total_tests、positive、negative),所以循环只会执行4次,最终生成的df_add只有4行数据。 - 你用
pd.concat按列拼接的时候,原始DataFrame长度远大于4,不足的行就会自动填充NaN,刚好对应你前4行有值、后续全是NaN的现象。
修正方案
直接遍历原始DataFrame的所有行索引即可,不要遍历单条数据的处理结果,修正后代码如下:
def CleanCovidTest(df_test): df_add = pd.DataFrame() # 遍历所有行的索引,代替之前错误的循环逻辑 for s in range(len(df_test)): result = isValidString(df_test.testresults.iloc[s]) df_add = df_add.append(result, ignore_index = True) df_test = pd.concat([df_test, df_add], axis = 1) return df_test
如果想要更高的运行效率,也可以用apply方法代替循环,代码更简洁:
def CleanCovidTest(df_test): # 直接对testresults列批量应用处理函数,把返回的字典序列转为DataFrame df_add = df_test['testresults'].apply(isValidString).apply(pd.Series) df_test = pd.concat([df_test, df_add], axis = 1) return df_test
内容的提问来源于stack exchange,提问作者tim_g
相关产品推荐
相关产品推荐

