读取 API 个 CSV 的单列

Read a single column of a CSV for API Call

如何在 python 中完成这样的任务?我得到了一个带有一堆参数的 CSV 文件,比方说 "col""para" .所以,我想将 "para" 列中的所有参数作为一个数组循环并获取每个响应数据并写入 CSV 文件?

col para return
a e
b f
c g

喜欢

para = [e,f,g]

有了这个数组后,我就可以将它们中的每一个都用于 API 查询。例如,http://api.com/query?name=e 将 return 一个 JSON 这样的响应

{
 "data":[
 {
  "id": 1,
  "name": "e",
  "response":"return e from api" 
 }, {
  "id": 11,
  "name": "second ",
  "response":"return seconde from api" 
 }
]
}

从 API 调用中检索响应数据后,可以将其写入 CSV 文件中的 return 列。

所以最后,我正在寻找 table 如下所示

col para return
a e return e from api
b f return f from api
c g return g from api

你需要的是DataFrame的apply()函数。这个函数可以对一列的每个元素做同样的操作。

How to use apply function in pandas

这是您的案例示例:

import pandas as pd
import requests

data = pd.read_csv("input_file.csv") 
url = "http://api.com/query?name={}"

data['return'] = data['para'].apply(lambda x:requests.get(url.format(x)).text)

data.to_csv("output_file.csv",index=False)

更多的过程,可以定义一个函数来代替上面的lambda函数:

import pandas as pd
import requests
import json

def my_process(para):
    url = "http://api.com/query?name={}".format(para)
    try:
        return_json = json.loads(requests.get(url).text)
        response = return_json['data'][0]['response'] # get the first response string
    except:
        response = ""  # set a value for the case that the API call has no correct results
    return response

data = pd.read_csv("input_file.csv") 
data['return'] = data['para'].apply(my_process)

data.to_csv("output_file.csv",index=False)

<ipython-input-29-77b593e201eb> in <module>
     11 
     12 data = pd.read_csv("input.csv")
---> 13 data['return'] = data['para'].apply(my_process)
     14 
     15 data.to_csv("output_file.csv",index=False)

~\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3846             else:
   3847                 values = self.astype(object).values
-> 3848                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3849 
   3850         if len(mapped) and isinstance(mapped[0], Series):

pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-29-77b593e201eb> in my_process(para)
      6     url = "http://api.com/query?name={}".format(para)
      7     return_json = json.loads(requests.get(url).text)
----> 8     response = return_json['data'][0]['response '] # get the first response string
      9     return response
     10