我正在使用 pandas 从 Twitter 数据集中执行一些字符串匹配。
我已导入推文的 CSV 并使用日期编制索引。然后我创建了一个包含文本匹配的新列:
In [1]:
import pandas as pd
indata = pd.read_csv('tweets.csv')
indata.index = pd.to_datetime(indata["Date"])
indata["matches"] = indata.Tweet.str.findall("rudd|abbott")
only_results = pd.Series(indata["matches"])
only_results.head(10)
Out[1]:
Date
2013-08-06 16:03:17 []
2013-08-06 16:03:12 []
2013-08-06 16:03:10 []
2013-08-06 16:03:09 []
2013-08-06 16:03:08 []
2013-08-06 16:03:07 []
2013-08-06 16:03:07 [abbott]
2013-08-06 16:03:06 []
2013-08-06 16:03:02 []
2013-08-06 16:03:00 [rudd]
Name: matches, dtype: object
我最终想要的是一个按日/月分组的数据框,我可以将不同的搜索词绘制为列,然后进行绘图。
我在另一个 SO 答案( https://stackoverflow.com/a/16637607/2034487 )上遇到了看起来完美的解决方案,但是在尝试申请这个系列时,我遇到了一个例外:
In [2]: only_results.apply(lambda x: pd.Series(1,index=x)).fillna(0)
Out [2]: Exception - Traceback (most recent call last)
...
Exception: Reindexing only valid with uniquely valued Index objects
我真的希望能够应用数据框中的更改来应用和重新应用 groupby 条件并有效地执行绘图 - 并且很想了解更多关于 .apply() 方法如何工作的信息。
提前致谢。
成功回答后更新
问题在于我没有看到的“匹配”列中的重复项。我遍历该列以删除重复项,然后使用上面链接的@Jeff 的原始解决方案。这很成功,我现在可以在结果系列上使用 .groupby() 来查看每日、每小时等趋势。这是结果图的示例:
In [3]: successful_run = only_results.apply(lambda x: pd.Series(1,index=x)).fillna(0)
In [4]: successful_run.groupby([successful_run.index.day,successful_run.index.hour]).sum().plot()
Out [4]: <matplotlib.axes.AxesSubplot at 0x110b51650>