Pandas - 迭代遍历数据框行并更新 df (一行代码)

3

以下是代码:

针对具有URL列表的数据框进行迭代,发送GET请求。最初创建3个新列,并根据先前的GET请求结果更新它们。

问题: 是否有一种选项可以在一行代码中编写三个“df.set_value”?

非常感谢您提前的帮助。

import pandas as pd, numpy as np

d = {'ListOfURLs': ['URL1', 'URL2', 'URL3']}
df = pd.DataFrame(data=d)

#print(df)
s = requests.session()
s.post(login_url, login_data)
for index, row in df.iterrows():
    r = s.get(row['ListOfURLs'])
    r.status_code
    if r.status_code == 200:
        # Update Dataframe , create initially 3 new columns and update them based on the results from the previous get request
        df.set_value(index, 'Status Code', r.status_code)
        df.set_value(index, 'Result', '[OK]')
        df.set_value(index, 'Error', np.nan)

为什么不先提取数据,然后再构建DataFrame呢? - Dani Mesejo
数据将从CSV文件中提取,主要目标是根据来自GET请求的结果更新df。我正在尝试弄清楚如何使用一行代码理想地更新df。 - Tomas Nemeth
status_code != 200 的值会是什么? - Dani Mesejo
你可以省略这部分内容,我最感兴趣的是如何将最后三行代码写成一行。 - Tomas Nemeth
可能是一个适合在codereview上提问的问题? - hd1
1
@hd1 这不是一个请求进行评论,而是一个请求进行具体的重写。在那里不会有好的效果。 - Mast
1个回答

6

您可以这样做:

import pandas as pd
import requests
import numpy as np

d = {'ListOfURLs': ['https://dev59.com/hb7pa4cB1Zd3GeqPxWLJ',
                    'https://dev59.com/hb7pa4cB1Zd3GeqPxWLJ',
                    'https://dev59.com/hb7pa4cB1Zd3GeqPxWLJ']}
df = pd.DataFrame(data=d)

for index, row in df.iterrows():
    r = requests.get(row['ListOfURLs'])
    if r.status_code == 200:
        df.at[index, ['Status Code', 'Result', 'Error']] = (r.status_code, '[OK]', np.nan)

print(df)

输出

                                     ListOfURLs  Status Code Result  Error
0  https://dev59.com/hb7pa4cB1Zd3GeqPxWLJ        200.0   [OK]    NaN
1  https://dev59.com/hb7pa4cB1Zd3GeqPxWLJ        200.0   [OK]    NaN
2  https://dev59.com/hb7pa4cB1Zd3GeqPxWLJ        200.0   [OK]    NaN

不要使用 set_value:

自版本0.21.0起已弃用:改用 .at[] 或 .iat[] 访问器。

请注意,为生成实际输出而省略了一些原始问题的细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接