2017-03-24 6 views
1

私は緯度と経度の座標を含む既存のデータフレーム( "radar_locations")を持っています。この情報には、国と州の列を追加する必要があります。逆ジオコードを使用し、必要な2つの値を返す関数を作成しました。return geodata.state, geodata.countryアンパック関数がpandasデータフレーム列に戻る

データフレーム内の新しい列に値を割り当てようとすると解凍するには値が多すぎるというエラーが表示されます。しかし、関数が単一の値を返すようにコードを更新すると、その値を新しいデータフレーム列に正常に書き込むことができます。

パンダのちょっと偏心しているのか、それとももっと根本的なものがあるのでしょうか?

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) 

答えて

2

使用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から直接割り当てるしようとしているとの問題は、複数の値を返すとき、あなたが実際にしているということです2つの別々の列ではなく1つのタプル列を返します。そのため、解凍プロセスが必要です。

df['A'].apply(some_func) 

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

これはトリックでした。多くのありがとう、@ルート。 – Barrett

関連する問題