当数据框列中有 NaN 时,如何将推文(对象)添加到绘图图表?

How do I add tweets (objects) to a plotly chart when I have NaN's in the dataframe column?

我有一个图表,我正在尝试将推文添加到悬停信息中。

数据框本身包含 7000 多行(每小时加密读数)和 139 条推文,标记为 content。在 content 中,'NaN' 有 ~6861 行,因为 content 总共有 139 条推文。

我下面的代码

fig = px.line(total_data, x = total_data.date,
                          y = total_data.doge_close)
fig.add_trace(
              go.Scatter(
                         x=total_data[total_data.has_tweet==1].date,
                         y=total_data[total_data.has_tweet == 1['doge_close'],
                         mode = 'markers',
                         hovertemplate = 
                                    '<i>tweet:</i>'+ '<br>' +
                                    
                                    '<i>%{text}</i>',
                                    
                                    text = [t for t in total_data['content']],
                                    name = 'has_tweets'))
fig.show()

产生这个情节:

哪里写着NaN,我要的是当时推文的实际内容。

可以使用以下代码松散地复制“内容”列:

df = px.data.stocks().set_index('date')[['GOOG']].rename(columns={'GOOG':'values'})
df['has_tweet'] = df['tweet'].apply(lambda x: 0 if x != x else 1)
df['tweet'] = random.choices(['A tweet','Longer tweet', 'emoji','NaN'], weights=(5,10,5,80), k=len(df))

并且可以使用以下代码进行一般复制:

import plotly.express as px
import plotly.graph_objects as go
import random

fig = px.line(df, x=df.index, y = 'values')
fig.add_trace(go.Scatter(x=df[df.has_tweet==1].index,
                     y = df[df.has_tweet==1]['values'],
                     mode = 'markers',
                     hovertemplate =
                                    '<i>tweet:</i>'+ '<br>' +
                                    
                                    '<i>%{text}</i>',
                     text = [t for t in df['tweet']],
                     name = 'has_tweets'))
fig.show()

有没有办法从数据框中过滤掉 'NaN' 以输入实际的推文内容?

用解决方案编辑

感谢一位非常友好的评论者,我已经找到了解决方案并将其附在下面,以供将来使用。

fig = px.line(total_data, x = total_data.date, y = total_data.doge_close)
fig.add_trace(go.Scatter(x=total_data[total_data.has_tweet==1].date,
                     y=total_data[total_data.has_tweet==1]['doge_close'],
                     mode = 'markers',
                     hovertemplate = 
                                    '<i>tweet:</i>'+ '<br>' +
                                    
                                    '<i>%{text}</i>',
                                    
                                    text = [t for t in total_data.loc[total_data['has_tweet']==1, 'content']],
                                    name = 'has_tweets'))
fig.show()

产生:

根据您的评论,不是随机分配 0 或 1 到 "has_tweet" 列,而是应根据“tweet”列是否为 NaN 分配 0 或 1。另外,我使用的不是字符串“NaN”np.nan,但这可能需要根据您的实际数据进行修改。

我们可以像这样创建一些类似于您的数据:

import numpy as np
import plotly.express as px
import plotly.graph_objects as go
import random

random.seed(42)
df = px.data.stocks().set_index('date')[['GOOG']].rename(columns={'GOOG':'values'})
df['tweet'] = random.choices(['A tweet','Longer tweet', 'emoji',np.nan], weights=(5,10,5,80), k=len(df))
df['has_tweet'] = df['tweet'].apply(lambda x: 0 if x != x else 1)

然后我相信我们需要做的唯一改变就是只将包含推文的行传递给文本参数:

fig = px.line(df, x=df.index, y = 'values')
fig.add_trace(go.Scatter(x=df[df.has_tweet==1].index,
                     y = df.loc[df.has_tweet==1]['values'],
                     mode = 'markers',
                     hovertemplate =
                                    '<i>tweet:</i>'+ '<br>' +
                                    
                                    '<i>%{text}</i>',
                     text = [t for t in df.loc[df.has_tweet==1, 'tweet']],
                     name = 'has_tweets'))
fig.show()