我有一个现有的数据帧(" 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)
答案 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)