按名称加入 Dataframe ,然后按Pandas自动填充空白值,使用matplotlib根据值创建彩色散点图

jc3wubiy  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(99)

我想知道有没有一种优雅而有效的方法来实现我的标题所说的。

import pandas as pd

data1 = pd.DataFrame([['ad_001','50'], ['ad_002', '100'], ['ad_003', '150']],columns=['name', 'score'])
  
data2 = pd.DataFrame([['ad_001','75'], ['ad_002', '200'], ['ad_004', '100']],columns=['name', 'score'])

我试过用

data1.merge(data2, how='left', left_on='name', right_on='name')

以合并两个 Dataframe 。
我的目标是连接以下 Dataframe 并自动填充缺失值:

data1 = pd.DataFrame([['ad_001','50','75'], ['ad_002', '100', '200'], ['ad_003', '150', '0'], ['ad_004', '0', '100']],columns=['name', 'score_x','score_y'])

然后我想用matplotlib显示数据的散点图,并根据x和y的最大得分给每个点着色。

  • 如果x或y〉100,则为红色
  • 如果x或y〉150,则为绿色
  • 如果x或y〉200,则为红色。

我试着看了一下用户指南,但是我很清楚如何实现它。
或者有没有其他的绘图python模块,一个人会建议达到同样的结果?

mklgxw1f

mklgxw1f1#

对于合并两个 Dataframe 的第一部分,其中一种方法是使用merge和outer,以便捕获所有列。这将包括所有包含nan但没有数据可用的行。使用.fillna(0)将处理此问题--基于您提到的无效数字的显示方式。
对于条件和绘图,最简单的方法是使用类似np.where()的东西,您可以使用它来确定您想要的颜色。由于您的问题有两个条件red,因此我将其中一个设置为红色,而另一个设置为蓝色。您可以根据需要调整数字和颜色。一旦带有颜色的列可用,使用groupby()和绘图将给予出你需要的结果。希望这对你有帮助...

import pandas as pd
import matplotlib.pyplot as plt
data1 = pd.DataFrame([['ad_001','50'], ['ad_002', '100'], ['ad_003', '150']],columns=['name', 'score'])
data2 = pd.DataFrame([['ad_001','75'], ['ad_002', '200'], ['ad_004', '100']],columns=['name', 'score'])

newdata=pd.merge(data1, data2, on="name", how='outer').fillna(0) ## Merge & fillna()
newdata['score_x']=newdata['score_x'].astype('int64') ## Convert to int as you are comparing
newdata['score_y']=newdata['score_y'].astype('int64') ## Convert to int as you are comparing

##Use np.where to create color column with the colors you need
newdata['color']=np.where(((newdata.score_x<100) & (newdata.score_y<100)), 'red', 
                       np.where(((newdata.score_x<150) & (newdata.score_y<150)), 'green', 'blue'))

## Group and plot
fig, ax = plt.subplots()
for clr, d in newdata.groupby('color'):
    ax.scatter(x=d['score_x'],y=d['score_x'], label=clr)

相关问题