读取 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
如何在 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