【问题标题】:Mapping each element in list to different column in pandas dataframe将列表中的每个元素映射到熊猫数据框中的不同列
【发布时间】:2017-02-06 16:25:18
【问题描述】:

背景:我有一个包含个人姓名和地址的数据框。我正在尝试对与我的数据框中的每个人关联的人员进行编目,因此我通过一个返回与个人关联的人员列表的外部 API 运行数据框中的每一行/记录。这个想法是编写一系列调用 API 的函数,返回亲属列表,并将列表中的每个名称附加到原始数据帧中的不同列。代码最终会被并行化。

数据框:

import pandas as pd

df = pd.DataFrame({
'first_name': ['Kyle', 'Ted', 'Mary', 'Ron'],
'last_name': ['Smith', 'Jones', 'Johnson', 'Reagan'],
'address': ['123 Main Street', '456 Maple Street', '987 Tudor Place', '1600 Pennsylvania Avenue']},
columns = ['first_name', 'last_name', 'address'])

第一个函数,调用 API 并返回名称列表:

import requests
import json
import numpy as np
from multiprocessing import Pool

def API_call(row):
    api_key = '123samplekey'
    first_name = str(row['First_Name'])
    last_name = str(row['Last_Name'])
    address = str(row['Street_Address'])
    url = 'https://apiaddress.com/' + '?first_name=' + first_name + '?last_name=' + last_name + '?address' = address + '?api_key' + api_key
    response = requests.get(url)
    JSON = response.json()
    name_list = []
    for index, person in enumerate(JSON['people']):
        name = JSON['people'].get('name')
        name_list.append(name)
    return name_list

这个功能很好用。对于数据框中的每个人,都会返回家人/朋友的列表。因此,对于 Kyle Smith,该函数返回 [Heather Smith, Dan Smith],对于 Ted Jones,该函数返回 [Al Jones, Karen Jones, Tiffany Jones, Natalie Jones],以此类推,对于数据帧中的每一行/记录。

问题:我正在努力编写一个后续函数,该函数将遍历返回的列表并将每个值附加到与数据框中的搜索名称相对应的唯一列。我希望函数返回如下所示的数据库:

First_Name | Last_Name  | Street_Address           | relative1_name  | relative2_name  | relative3_name   | relative4_name
-----------------------------------------------------------------------------------------------------------------------------
Kyle       | Smith      | 123 Main Street          | Heather Smith   | Dan Smith       |                  |
Ted        | Jones      | 456 Maple Street         | Al Jones        | Karen Jones     | Tiffany Jones    | Natalie Jones
Mary       | Johnson    | 987 Tudor Place          | Kevin Johnson   |                 |                  |
Ron        | Reagan     | 1600 Pennsylvania Avenue | Nancy Reagan    | Patti Davis     | Michael Reagan   | Christine Reagan

注意:目标是将所有内容向量化,以便我可以使用apply 方法并最终并行运行整个事情。过去,当“API_call”函数返回单个对象而不是需要迭代/映射的列表时,以下代码行中的某些内容对我有用:

def API_call(row):
    # all API parameters
    url = 'https//api.com/parameters'
    response = request.get(url)
    JSON = response.json()
    single_object = JSON['key1']['key2'].get('key3')
    return single_object

def second_function(data):
    data['single_object'] = data.apply(API_call, axis =1)
    return data

def parallelize(dataframe, function):
    df_splits = np.array_split(dataframe, 10)
    pool = Pool(4)
    df_whole = pd.concat(pool.map(function, df_splits))
    pool.close()
    pool.join()
    return df_whole

parallelize(df, second_function)

问题是我无法编写一个矢量化函数 (second_function) 将 API 返回的列表中的名称映射到原始数据帧中的唯一列。提前感谢您的帮助!

【问题讨论】:

    标签: python list function pandas vectorization


    【解决方案1】:
    import pandas as pd
    
    
    def make_relatives_frame(relatives):
    
        return pd.DataFrame(data=[relatives],
                            columns=["relative%i_name" % x for x in range(1, len(relatives) + 1)])
    
    # example output from an API call
    df_names = pd.DataFrame(data=[["Kyle", "Smith"]], columns=["First_Name", "Last_Name"])
    relatives = ["Heather Smith", "Dan Smith"]
    df_relatives = make_relatives_frame(relatives)
    df_names[df_relatives.columns] = df_relatives
    
    # example output from another API Call with more relatives
    df_names2 = pd.DataFrame(data=[["John", "Smith"]], columns=["First_Name", "Last_Name"])
    relatives2 = ["Heath Smith", "Daryl Smith", "Scott Smith"]
    df_relatives2 = make_relatives_frame(relatives2)
    df_names2[df_relatives2.columns] = df_relatives2
    
    # example of stacking the outputs
    total_df = df_names.append(df_names2)
    
    print total_df
    

    上面的代码应该可以帮助您入门。显然这只是一个代表性示例,但您应该能够对其进行重构以适合您的特定用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2020-09-20
      • 2018-09-20
      • 2021-04-30
      • 1970-01-01
      相关资源
      最近更新 更多