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

Posted

技术标签:

【中文标题】当我在数据框列中有 NaN 时,如何将推文(对象)添加到绘图图表中?【英文标题】:How do I add tweets (objects) to a plotly chart when I have NaN's in the dataframe column? 【发布时间】:2021-12-23 11:59:08 【问题描述】:

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

数据框本身包含 7000 多行(每小时加密读数)和 139 条推文,标记为 content。在 content 中,有大约 6861 行“NaN”,因为 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()

产生:

【问题讨论】:

我有点困惑。使用您复制的 DataFrame,df[df.has_tweet==1] 似乎仍然可以包含 NaNtweet 列。对吗? 对不起,应该更清楚地说明它,我认为它没有正确制定,因为它可以随机分配 has_tweet = 1,但在实际推文内容中有 NaN。真实数据集有has_tweetcontent 配对,这将是一条实际的推文。从功能上讲,如果has_tweet == 1,content 有一条实际推文,而不是 NaN。很抱歉造成混淆。 别担心!我认为df['has_tweet'] = df['tweet'].apply(lambda x: 0 if x != x else 1) 会保持一致 @DerekO 是的,看起来效果会更好。 【参考方案1】:

根据您的评论,不是随机分配 0 或 1 到 "has_tweet" 列,而是根据“tweet”列是否为 NaN,它应该是 0 或 1。另外,我使用的是np.nan,而不是字符串“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)

那么我相信我们需要做的唯一改变就是将带有推文的行传递给 text 参数:

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()

【讨论】:

以上是关于当我在数据框列中有 NaN 时,如何将推文(对象)添加到绘图图表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框列中附加值

如何在熊猫数据框列中获取 NaN 观察的频率 [重复]

如何将推文发送到我的 Twitter 帐户?

计算 r 中数据框列中数值之间的 NaN 平均数

如何从 Pandas 数据框列中的日期时间减去 3 小时?

如何将推特链接转换为嵌入式推文?