2016-04-23 5 views
1

私はGeoJSONファイルを作成するのに役立つ関数を作成しようとしています。私はユーザーの性別や活動状況に応じて色のプロパティを設定しようとしています。私がこれまでに作成した機能:関数内でのパンダの機能ValueError

import os 
import pandas as pd 
import numpy as np 

def create_geojson(df): 

    def colour_func(): 
     if (df["Status"] == "Inactive"):       #line 167 
      return "#808080" 
     elif (df["Status"] == "Active" and df["Gender"] == "Male"): 
      return "#0000FF" 
     else: 
      return "#FF99FF" 

    z = len(df) 
    output = "C:\\Users\\Lukasz Obara\\Desktop\\Members.txt" 
    f = open(output, "w") 
    f.write('var Members = {\n\t' + 
      '"type": "FeatureCollection",\n\t' + 
      '"features": [') 

    for x in range(0, z-1): 
     if (isinstance(df["Addr-Formatted"][x], str)): 

      f.write('{\n\t\t"type": "Feature",\n\t\t' + 
       '"geometry": {\n\t\t\t' + 
        '"type": "Point",\n\t\t\t' + 
        '"coordinates": [%f, %f] \n\t\t' % (df["Lng"][x], 
                 df["Lat"][x]) + 
        '}, \n\t\t' + 
       '"properties": {\n\t\t\t' + 
        '"Name": "%s, %s",\n\t\t\t' % (df['Member Name-First'][x], 
                df['Member Name-Last'][x]) + 
        '"Colour": "%s" \n\t\t' % colour_func() + 
       "}\n\t" +          #line 205 
      "}, ") 

    f.close() 
    os.rename(output, "C:\\Users\\Lukasz Obara\\Desktop\\Members.geojson") 

は、私は単に適切な色(グレー、ブルー、ピンク)を返すようにcreate_geojsonからdfを使用していますので、colour_func()が空であることを考え出したが、私は入れません:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\Lukasz Obara\desktop\Test.py", line 205, in create_geojson 
    "}\n\t"+ 
    File "C:\Users\Lukasz Obara\desktop\Test.py", line 167, in colour_func 
    if (df["Status"] == "Inactive"): 
    File "C:\Users\Lukasz Obara\Anaconda3\lib\site-packages\pandas\core\generic.py", line 887, in __nonzero__ 
    .format(self.__class__.__name__)) 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

答えて

2

&を使用して、2つのブール値のシリーズではないandを結合します。また、比較をグループ化する必要があります()

ので、変更:

elif (df["Status"] == "Active" and df["Gender"] == "Male"): 

へ:

elif ((df["Status"] == "Active) & (df["Gender"] == "Male")): 

EDIT

トレースバックができます。インデックスを指定する必要があります。

def colour_func(ind): 
    if df.loc[ind, "Status"] == "Inactive": 
     return "#808080" 
    elif df.loc[ind, "Status"] == "Active" and df.loc[ind, "Gender"] == "Male": 
     return "#0000FF" 
    else: 
     return "#FF99FF" 

以降インデックスzを使用して関数を呼び出す:

'"Colour": "%s" \n\t\t' % colour_func(z) + 
+0

私は変更を試みたと 'ValueError'を送出が持続します。 – Lukasz

+1

行番号を含む完全なトレースバックを表示してください。また、コード内でこの行を識別します。そうでなければ、このエラーがどこで発生するかを知る方法はありません。 –

+0

完全なエラーが含まれています。私は 'colour_func()'のネストされていない関数をテストしましたが、私はエラーを生成しません。 – Lukasz