【问题标题】:Iterating a python script through each rows in pandas遍历熊猫中的每一行的python脚本
【发布时间】:2019-03-23 06:47:03
【问题描述】:

我有一个用于通过 slack 发送 twitter 警报的 python 脚本:-

def twitter_setup():
    """
    Utility function to setup the Twitter's API
    with our access keys provided.
    """
    # Authentication and access using keys:
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

    # Return API with authentication:
    api = tweepy.API(auth)
    return api


extractor = twitter_setup()
# We create a tweet list as follows:
tweets = extractor.user_timeline(screen_name="**FortniteGame**", count=200)


data = pd.DataFrame(data=[tweet.text for tweet in tweets], columns=['Tweets'])

# We add relevant data:
data['ID'] = np.array([tweet.id for tweet in tweets])
data['Date'] = np.array([tweet.created_at for tweet in tweets])
data['text'] = np.array([tweet.text for tweet in tweets])
#data['Date'] = pd.to_datetime(data['Date'], unit='ms').dt.tz_localize('UTC').dt.tz_convert('US/Eastern')

created_time = datetime.datetime.utcnow() - datetime.timedelta(minutes=1)

data = data[(data['Date'] > created_time) & (
    data['Date'] < datetime.datetime.utcnow())]

my_list = ['Maintenance', 'Scheduled', 'downtime', 'Issue', 'Voice', 'Happy',
           'Problem', 'Outage', 'Service', 'Interruption', 'voice-comms', 'Downtime']

ndata = data[data['Tweets'].str.contains(
    "|".join(my_list), regex=True)].reset_index(drop=True)


slack = Slacker('xoxb-3434-4334-fgsgsdfsf')

#message = "test message"
slack.chat.post_message('#ops-twitter-alerts', 'FNWP :' +' '+ ndata['Tweets'] + '<!channel|>')

现在我有一个 csv 文件,我在 pandas 中读取,如下所示

       client domain twittername
1.)    EPIC   FNWP   FortniteGame
2.)    PUBG   BLHP   PUBG
3.)    abc    xyx    abhi98358

我想为每个客户端使用相同的脚本,并且我想遍历它并假设它首先会为 Fortnite 做,然后是 PUBG,然后是 abhi98358,并且它应该以同样的方式逐步进行。

【问题讨论】:

  • 使用 iterrows 或 for 循环就足以通过数据框
  • 嘿 @SarthakNegi 我是 python 新手...我擅长脚本编写,但在循环和所有方面都不太擅长。这里有两个我想要动态的变量,一个是推特名称,一个是'FNWP:'+客户名称。如果你能提供一些示例代码。
  • @ak333:我可以看到你在这行代码tweets = extractor.user_timeline(screen_name="**FortniteGame**", count=200) 上只使用了columntwitername。因此,您只想对此使用迭代而不是硬编码FortniteGame?。如果我错了,请纠正我?

标签: python python-3.x pandas dataframe automation


【解决方案1】:

给你

参考我的解决方案converting a python script into a function to iterate over each row

for index, row in dff.iterrows():
    twt=row['twittername']
    domain = row['domain']
    print(twt)
    print(domain)
    extractor = twitter_setup()
    # We create a tweet list as follows:
    tweets = extractor.user_timeline(screen_name=twt, count=200)
    data = pd.DataFrame(data=[tweet.text for tweet in tweets], columns=['Tweets'])

    # We add relevant data:
    data['ID'] = np.array([tweet.id for tweet in tweets])
    data['Date'] = np.array([tweet.created_at for tweet in tweets])
    data['text'] = np.array([tweet.text for tweet in tweets])
    #data['Date'] = pd.to_datetime(data['Date'], unit='ms').dt.tz_localize('UTC').dt.tz_convert('US/Eastern')

    created_time = datetime.datetime.utcnow() - datetime.timedelta(minutes=160)

    data = data[(data['Date'] > created_time) & (data['Date'] < datetime.datetime.utcnow())]

    my_list = ['Maintenance', 'Scheduled', 'downtime', 'Issue', 'Voice', 'Happy','hound',
               'Problem', 'Outage', 'Service', 'Interruption', 'ready','voice-comms', 'Downtime','Patch']

    ndata = data[data['Tweets'].str.contains( "|".join(my_list), regex=True)].reset_index(drop=True)

    print(ndata)
    if len(ndata['Tweets'])> 0:
        slack.chat.post_message('#ops-twitter-alerts', domain  +': '+ ndata['Tweets'] + '<!channel|>')
    else:
        print('hi')

【讨论】:

    【解决方案2】:

    你可以像下面那样做

    twtLst = []
    for _, row in df.iterrows():
       twtDtl = row['client'], row['domain'], row['twittername']
       twtLst.append(twtDtl)
    

    twtLst 将是一个元组列表,然后您可以像下面这样访问它

    for twt in twtLst:
        client, domain, twtname = twt
        tweets = extractor.user_timeline(screen_name="**" + twtname +"**", count=200)
        #message = "test message"
        slack.chat.post_message('#ops-twitter-alerts', domain + ':' + client +' '+ndata['Tweets'] + '<!channel|>')
    

    【讨论】:

    • 在第二个块中,我只需要屏幕名称而不需要其他任何东西,所以我应该像 tweets = extractor.user_timeline(screen_name="**" , count=200) 那样做一些事情。对吗?
    • 没错,"**" + twtname +"**" 只是 3 个字符串的串联
    • 它同时给了我两个客户的推文列表。
    • 我希望它应该对它们中的每一个进行相同的处理,而不是一起处理。
    【解决方案3】:

    样本df:

    t = pd.DataFrame({'A': ['FortniteGame', 'PUBG', 'abhi98358']})
    

    样本迭代:

    for index, row in t.iterrows():
       print "**" + row['A'] +"**"
    

    上面的示例输出:

    **FortniteGame**
    **PUBG**
    **abhi98358**
    

    对于您的代码:

    for index,rows in df.iterows():
       tweets = extractor.user_timeline(screen_name=("**" + row['twittername'] +"**"), count=200)
    

    【讨论】:

    • 我现在要试试
    • 非常感谢我正在尝试如果我不能再发帖了
    • 如果它解决了您正在寻找的问题,请接受并为未来的用户投票!
    • 所以它与你的例子一起工作,但是当我尝试我的时候,它说 AttributeError: 'DataFrame' object has no attribute 'iterows' ......我也不知道'不想同时为所有用户获取推文,我希望它应该为一个用户完成脚本,然后继续第二行,依此类推,
    • 仍然是同样的问题...下面我为索引编写了 t.iterows 中的行:tweets = extractor.user_timeline(screen_name=(row.twittername), count=200) data = pd. DataFrame(data=[tweet.text for tweets in tweets], columns=['Tweets']) # 我们添加相关数据: data['ID'] = np.array([tweet.id for tweets in tweets]) data ['Date'] = np.array([tweet.created_at 用于推文中的推文]) data['text'] = np.array([tweet.text 用于推文中的推文])
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2021-08-25
    • 2021-12-18
    • 2021-01-06
    • 2018-08-11
    • 2014-09-08
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多