当我在数据框列中有 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]
似乎仍然可以包含 NaN
的 tweet
列。对吗?
对不起,应该更清楚地说明它,我认为它没有正确制定,因为它可以随机分配 has_tweet
= 1,但在实际推文内容中有 NaN
。真实数据集有has_tweet
与content
配对,这将是一条实际的推文。从功能上讲,如果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 时,如何将推文(对象)添加到绘图图表中?的主要内容,如果未能解决你的问题,请参考以下文章