matplotlib 如何在python中添加两个不同csv列的条目时避免得到Nan

rryofs0p  于 2022-11-15  发布在  Python
关注(0)|答案(1)|浏览(109)

我添加了两个不同的csv列来制作二维历史图。我有两种不同类型的数据,分别是densecollision
此外,每个数据都包括我的案例研究的信息,其中type列有type=0(大)和type=1(小)。csv看起来像这样(来自碰撞):

TIMESTEP id     type    a      |f|     |v|  
20000   4737     0     9.81  1.31495  4.18007   
40000  11991     1     9.81  4.43794  4.17909   
50000  15725     1     9.81  4.43794  4.17810     
30000   8209     0     9.81  4.43794  4.17810     
15000   3545     0     9.81  1.31495  4.17810   
30000   8269     0     9.81  4.43794  4.17810    
10000   2077     1     9.81  1.31495  4.17712   
20000   5079     0     9.81  1.31495  4.17712

所有数据都是float类型,具有正条目。
当我分别绘制type=0(大)和type=1(小)两种类型的a|f|时,我没有遇到任何问题。而且绘图也是有意义的。但是,从small + big(即每个部分的每个条目的总和)绘制a|f|看起来很奇怪。
我意识到small + big给了我几乎90%南,虽然原始数据没有任何Nan
如何在进行small + big时避免Nan,以制作完美的历史图?
我意识到数据在collision:Small+Big中丢失。我希望有像Dense:Small+Big这样的图。
我的代码如下:

from cProfile import label
from matplotlib.colors import LogNorm

df_collision_big = df_collision[df_collision['type'] == 0]
df_collision_small = df_collision[df_collision['type'] == 1]

df_dense_big =   df_dense[df_dense['type'] == 0]
df_dense_small = df_dense[df_dense['type'] == 1]

plt.subplots(figsize=(14, 6))
#make space between subplots
plt.subplots_adjust(wspace=0.5, hspace=0.6)
plt.subplot(231)
plt.hist2d(df_collision_small['a'], df_collision_small['|f|'], bins=np.linspace(0,70,15), norm=LogNorm())
plt.colorbar()
plt.xlabel('a')
plt.ylabel('|f|')
plt.title('Collision: Small')
plt.subplot(232)
plt.hist2d(df_collision_big['a'], df_collision_big['|f|'], bins=np.linspace(0,70,15), norm=LogNorm())
plt.colorbar()
plt.xlabel('a')
plt.ylabel('|f|')
plt.title('Collision: Big')
plt.subplot(233)
plt.hist2d(df_collision_big['a'] + df_collision_small['a'], df_collision_big['|f|'] + df_collision_small['|f|'], bins=np.linspace(0,70,15), norm=LogNorm())
plt.colorbar()
plt.xlabel('a')
plt.ylabel('|f|')
plt.title('Collision: Small + Big')

plt.subplot(234)
plt.hist2d(df_dense_small['a'], df_dense_small['|f|'], bins=np.linspace(0,70,15), norm=LogNorm())
plt.colorbar()
plt.xlabel('a')
plt.ylabel('|f|')
plt.title('Dense: Small')
plt.subplot(235)
plt.hist2d(df_dense_big['a'], df_dense_big['|f|'], bins=np.linspace(0,70,15), norm=LogNorm())
plt.colorbar()
plt.xlabel('a')
plt.ylabel('|f|')
plt.title('Dense: Big')
plt.subplot(236)
plt.hist2d(df_dense_big['a'] + df_dense_small['a'], df_dense_big['|f|'] + df_dense_small['|f|'], bins=np.linspace(0,70,15), norm=LogNorm())
plt.colorbar()
plt.xlabel('a')
plt.ylabel('|f|')
plt.title('Dense: Big + Small')
plt.savefig('hist2d.png', dpi=300)
plt.show()

打印df_collision['a]会得到以下结果:

175761    9.810009
409899    9.810058
429591    9.810058
358086    9.810009
89079     9.810009
            ...   
243866    9.810058
125778    9.810009
185374    9.810009
496586    9.810058
234942    9.810058
Name: a, Length: 27832, dtype: float64

a中的大多数值都是相似的。
打印df_collision_big['a'] + df_collision_small['a']会得到以下结果:

0         19.620067
1         19.620067
2         19.620067
3         19.620067
4         19.620067
            ...    
504208          NaN
504209          NaN
504210          NaN
504211          NaN
504212          NaN
Name: a, Length: 18639, dtype: float64

还有一件事:
打印镜头的大小给我这个:

print(len(df_collision_small['a']))
print(len(df_collision_big['a']))

# Output
13772
14060

希望能有一些建议来解决这个问题。

  • 谢谢-谢谢
ukdjmx9f

ukdjmx9f1#

您可以将NaN问题归结为:

pd.merge(df_collision_small["a"], df_dense_big["a"], how="outer", left_index=True, right_index=True).sum(axis=1)

说明

索引上的outer join导致来自两个 Dataframe 的“a”放在一起(索引/位置方式)的 Dataframe :

df_collision_small = pd.DataFrame({"a" : [1,2]})
>>    a
>> 0  1
>> 1  2

df_dense_big = pd.DataFrame({"a" : [10,20,30,40]})
>>     a
>> 0  10
>> 1  20
>> 2  30
>> 3  40

pd.merge(df_collision_small, df_dense_big, how="outer", left_index=True, right_index=True)
>>    a_x  a_y
>> 0  1.0   10
>> 1  2.0   20
>> 2  NaN   30
>> 3  NaN   40

sum(axis=1)在对以下值求和时忽略NaN

pd.merge(df_collision_small["a"], df_dense_big["a"], how="outer", left_index=True, right_index=True).sum(axis=1)
>> 0    11.0
>> 1    22.0
>> 2    30.0
>> 3    40.0

相关问题