解包函数返回到pandas dataframe列

时间:2017-03-24 20:46:51

标签: python pandas

我有一个现有的数据帧(" radar_locations"),其中包含(除其他外)纬度和经度坐标。对于该信息,我需要添加一个国家/地区和州列,因此我编写了一个执行反向地理编码的函数并返回所需的两个值return geodata.state, geodata.country

当我尝试将值分配到数据框中的新列时,我收到一个错误,即要解压缩的值太多。但是,如果我更新代码以便函数返回单个值,我可以成功地将该值写入新的数据帧列。

如果这只是熊猫的怪癖,还是有一些更基本的东西我不知道?

工作原理

def reverse_geocode(lat, long):
    ...
    return geodata.country

radar_locations['Country'] = radar_locations.apply(lambda x: reverse_geocode(x[1], x[0]), axis=1)

工作原理

def reverse_geocode(lat, long):
    ...
    return geodata.state, geodata.country

state, country = reverse_geocode(mylat, mylong)

失败

def reverse_geocode(lat, long):
    ...
    return geodata.state, geodata.country

radar_locations['State'], radar_locations['Country'] = radar_locations.apply(lambda x: reverse_geocode(x[1], x[0]), axis=1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-28-82e3c63a2ecb> in <module>()
     19         raise
     20 
---> 21 radar_locations['State'], radar_locations['Country'] =   radar_locations.apply(lambda x: reverse_geocode(x[1], x[0]), axis=1)

ValueError: too many values to unpack (expected 2)

1 个答案:

答案 0 :(得分:3)

使用zip*运算符解压缩并执行分配:

# A function that returns multiple things.
def some_func(x):
    return x+1, x+2

# Example DataFrame
df = pd.DataFrame({'A': range(5)})

# Example usage.
df['B'], df['C'] = zip(*df['A'].apply(some_func))

结果输出:

   A  B  C
0  0  1  2
1  1  2  3
2  2  3  4
3  3  4  5
4  4  5  6

尝试直接从apply分配的问题是,当您返回多个值时,您实际上会返回单列的元组,而不是两个单独的列,这就是解压缩过程的原因必要的:

df['A'].apply(some_func)

0    (1, 2)
1    (2, 3)
2    (3, 4)
3    (4, 5)
4    (5, 6)