如何在while循环中用两个Pandas Series创建无NaN的DataFrame
我尝试在while循环中利用两个Pandas Series创建DataFrame。打印两个Series时,得到如下结果:
Print(a)
0 0.159175
Name: Time, dtype: float64
0 0.531096
Name: Time, dtype: float64
0 0.688536
Name: Time, dtype: float64
0 0.883937
Print(b)
0 18
Name: Inventory, dtype: int64
0 14
Name: Inventory, dtype: int64
0 12
Name: Inventory, dtype: int64
0 9
我使用以下代码尝试创建DataFrame:
df = pd.DataFrame() while s.clock <= 2.0: s.advance_time() a = pd.Series([s.clock], name = 'Time') b = pd.Series([s.inventory], name = 'Inventory') df= pd.concat([df, pd.DataFrame(a),pd.DataFrame(b)], axis =0, ignore_index=True) df
得到的df输出如下:
Time Inventory 0 0.159175 NaN 1 NaN 18.0 2 0.531096 NaN 3 NaN 14.0 4 0.688536 NaN 5 NaN 12.0 6 0.883937 NaN 7 NaN 9.0 8 0.999041 NaN 9 NaN 6.0
如何消除DataFrame中的NaN值,使每行同时包含Series a和b的有效值?
出现NaN的核心原因是:你每次循环都把Time和Inventory的Series分别作为独立行拼接到DataFrame,导致两者交替出现,自然会产生空值。下面是几种实用的解决办法:
方法1:直接创建单行DataFrame拼接
不用分开处理两个Series,直接把当前循环的clock和inventory整合成一个单行的DataFrame,再拼到主DataFrame中:
df = pd.DataFrame() while s.clock <= 2.0: s.advance_time() # 生成包含两列的单行DataFrame single_row = pd.DataFrame({'Time': [s.clock], 'Inventory': [s.inventory]}) df = pd.concat([df, single_row], ignore_index=True)
方法2:先收集数据到列表,最后一次性生成DataFrame
这种方法效率更高,避免循环内反复拼接DataFrame(Pandas的拼接操作有一定开销):
times = [] inventories = [] while s.clock <= 2.0: s.advance_time() times.append(s.clock) inventories.append(s.inventory) # 用收集好的列表直接创建DataFrame df = pd.DataFrame({'Time': times, 'Inventory': inventories})
方法3:合并同一次循环的两个Series
如果一定要保留使用Series的方式,可以把同一次循环生成的a和b按列合并成单行DataFrame,再拼接到主df:
df = pd.DataFrame() while s.clock <= 2.0: s.advance_time() a = pd.Series([s.clock], name='Time') b = pd.Series([s.inventory], name='Inventory') # 按列合并两个Series,得到单行数据 single_row = pd.concat([a, b], axis=1) df = pd.concat([df, single_row], ignore_index=True)
内容的提问来源于stack exchange,提问作者Lonestar101

