Pandas中拼接浮点数列生成无NaN的新Series问题
Pandas中拼接浮点数列生成无NaN的新Series问题
嘿,看了你的问题,我明白你想要把A、B、D三列里所有非NaN的浮点数值垂直拼起来,生成一个新的Series或者列对吧?你之前的代码问题出在notna()上——这个方法返回的是布尔值(True/False),而不是你要保留的原浮点数值,所以结果肯定不是你想要的。
下面给你两种简单可行的解决方案:
方法一:逐列提取非NaN值后拼接
这种方法直接明了,适合列数不多的情况:
import pandas as pd # 假设你的数据框是df,先分别提取每列的非NaN值,再垂直拼接 combined_series = pd.concat( [df['A'].dropna(), df['B'].dropna(), df['D'].dropna()], ignore_index=True # 重置索引,避免原索引重复混乱 ) # 如果需要把这个Series作为新列添加到原DataFrame,注意: # 原DataFrame的行数和新Series的长度大概率不一致,直接赋值会自动用NaN填充缺失行,比如: df['A+B+D'] = combined_series.reindex(df.index)
这里dropna()的作用就是移除列中的NaN值,只保留有效的浮点数值,再用pd.concat()把这些干净的Series垂直堆叠起来。
方法二:用melt转长格式后过滤NaN
如果需要处理的列比较多,这种方法更高效,不用逐列写dropna():
# 先把A、B、D列转成长格式,同时指定值列的名称 melted_df = df.melt( value_vars=['A', 'B', 'D'], # 指定要处理的列 value_name='A+B+D' # 新值列的名称 ) # 过滤掉NaN值,再提取结果Series combined_series = melted_df.dropna(subset=['A+B+D'])['A+B+D'].reset_index(drop=True)
melt()会把指定的列“拉长”成两列(原列名和对应值),之后我们只需要过滤掉值为NaN的行,就能得到所有有效数值的集合。
两种方法都能得到你想要的、只包含非NaN浮点数值的垂直拼接结果,你可以根据自己的列数多少选择合适的方式~
备注:内容来源于stack exchange,提问作者James S.
相关产品推荐
相关产品推荐

