<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    Hi Michel,<br>
    <br>
    Thanks! I think I got the suggestions by Anna, Pietro and Moritz
    working, but this certainly looks like an handy function to have at
    hand. One possible disadvantage if using this in a script to be
    shared with others is that it would add an dependency on pandas,
    wouldn't it?<br>
    <br>
    Cheers,<br>
    <br>
    Paulo<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 01-10-15 10:01, Michel Wortmann
      wrote:<br>
    </div>
    <blockquote cite="mid:560CE850.7000803@pik-potsdam.de" type="cite">
      <meta content="text/html; charset=windows-1252"
        http-equiv="Content-Type">
      Hi Paulo,<br>
      I had the same problem some time ago. I am using pandas for a lot
      of things and discovered the quickest way to append a column to a
      vector table is using pandas' .to_sql dataframe method. Here is my
      full function for it:<br>
      <br>
      <pre>import pandas as pa</pre>
      <pre>dataframe = pa.DataFrame( ... )</pre>
      <pre>def appendColumns(vecttbl,dataframe,join=None,layer=1):</pre>
      <pre>    '''Upload a DataFrame (Series should be first converted into a sql compliant datafram)</pre>
      <pre>    to a grass vector table. Join is a valid column in vecttbl or if None take categories.</pre>
      <pre>    Always joins on df.index, which is not uploaded.'''</pre>
      <pre>    # get sqlite.db info</pre>
      <pre>    db = grass.vector_db(vecttbl)[layer]</pre>
      <pre>    con = sqlite3.connect(db['database'])</pre>
      <pre>    # decide join indeces</pre>
      <pre>    itbl = {False:db['key'],True:join}[join!=None]</pre>
      <pre>    # make series to dataframe</pre>
      <pre>    dataframe.to_sql('pandas_temp',con,if_exists='replace',index_label='ix') # index label?</pre>
      <pre>    # join columns to vecttbl</pre>
      <pre>    grass.run_command('v.db.join',map=vecttbl,column=itbl,</pre>
      <pre>                       other_table='pandas_temp',other_column='ix',</pre>
      <pre>                       subset_columns=','.join(map(str,dataframe.columns)))</pre>
      <pre>    # remove temp table</pre>
      <pre>    cur = con.cursor()</pre>
      <pre>    cur.execute('DROP TABLE IF EXISTS pandas_temp')</pre>
      <pre>    con.commit(); con.close()</pre>
      <pre>    return</pre>
      <br>
      The dataframe.to_sql line is essentially all you need, the rest of
      the function is just prepping. <br>
      Hope it helps,<br>
      Michel<br>
      <br>
      <br>
      <div class="moz-cite-prefix">On 10/01/2015 12:05 AM, Paulo van
        Breugel wrote:<br>
      </div>
      <blockquote cite="mid:560C5CA8.9050307@gmail.com" type="cite">
        <meta content="text/html; charset=windows-1252"
          http-equiv="Content-Type">
        <br>
        <br>
        <div class="moz-cite-prefix">On 30-09-15 17:52, Paulo van
          Breugel wrote:<br>
        </div>
        <blockquote cite="mid:560C0520.9030509@gmail.com" type="cite">
          <meta content="text/html; charset=windows-1252"
            http-equiv="Content-Type">
          <br>
          <br>
          <div class="moz-cite-prefix">On 30-09-15 17:47, Anna Petrášová
            wrote:<br>
          </div>
          <blockquote
cite="mid:CAE0EDEoSucig6AYsdar7O1MSpfFwUiJhttSia7aKPXmZf+qpWA@mail.gmail.com"
            type="cite">
            <div dir="ltr"><br>
              <div class="gmail_extra"><br>
                <div class="gmail_quote">On Wed, Sep 30, 2015 at 11:20
                  AM, Paulo van Breugel <span dir="ltr"><<a
                      moz-do-not-send="true"
                      class="moz-txt-link-abbreviated"
                      href="mailto:p.vanbreugel@gmail.com"><a class="moz-txt-link-abbreviated" href="mailto:p.vanbreugel@gmail.com">p.vanbreugel@gmail.com</a></a>></span>
                  wrote:<br>
                  <blockquote class="gmail_quote" style="margin:0px 0px
                    0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                    <div text="#000000" bgcolor="#FFFFFF">
                      <div>
                        <div class="h5"> <br>
                          <br>
                          <div>On 30-09-15 16:18, Anna Petrášová wrote:<br>
                          </div>
                          <blockquote type="cite">
                            <div dir="ltr"><br>
                              <div class="gmail_extra"><br>
                                <div class="gmail_quote">On Wed, Sep 30,
                                  2015 at 9:27 AM, Paulo van Breugel <span
                                    dir="ltr"><<a
                                      moz-do-not-send="true"
                                      href="mailto:p.vanbreugel@gmail.com"
                                      target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:p.vanbreugel@gmail.com">p.vanbreugel@gmail.com</a></a>></span>
                                  wrote:<br>
                                  <blockquote class="gmail_quote"
                                    style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                                    <div dir="ltr"><br>
                                      <div class="gmail_extra"><br>
                                        <div class="gmail_quote"><span>On

                                            Wed, Sep 30, 2015 at 11:53
                                            AM, Pietro <span dir="ltr"><<a
                                                moz-do-not-send="true"
                                                class="moz-txt-link-abbreviated"
href="mailto:peter.zamb@gmail.com"><a class="moz-txt-link-abbreviated" href="mailto:peter.zamb@gmail.com">peter.zamb@gmail.com</a></a>></span>
                                            wrote:<br>
                                            <blockquote
                                              class="gmail_quote"
                                              style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On




                                              Wed, Sep 30, 2015 at 9:51
                                              AM, Paulo van Breugel<br>
                                              <span><<a
                                                  moz-do-not-send="true"
class="moz-txt-link-abbreviated" href="mailto:p.vanbreugel@gmail.com"><a class="moz-txt-link-abbreviated" href="mailto:p.vanbreugel@gmail.com">p.vanbreugel@gmail.com</a></a>>

                                                wrote:<br>
                                                ><br>
                                                ><br>
                                                > On Wed, Sep 30,
                                                2015 at 2:02 AM, Anna
                                                Petrášová <<a
                                                  moz-do-not-send="true"
class="moz-txt-link-abbreviated" href="mailto:kratochanna@gmail.com"><a class="moz-txt-link-abbreviated" href="mailto:kratochanna@gmail.com">kratochanna@gmail.com</a></a>><br>
                                                > wrote:<br>
                                                >><br>
                                                >><br>
                                                >><br>
                                                >> On Tue, Sep 29,
                                                2015 at 6:09 PM, Paulo
                                                van Breugel<br>
                                                >> <<a
                                                  moz-do-not-send="true"
class="moz-txt-link-abbreviated" href="mailto:p.vanbreugel@gmail.com"><a class="moz-txt-link-abbreviated" href="mailto:p.vanbreugel@gmail.com">p.vanbreugel@gmail.com</a></a>>

                                                wrote:<br>
                                                >>><br>
                                                >>> This must
                                                be a very basic
                                                question, but I can't
                                                find an easy/direct way<br>
                                                >>> to do this.
                                                In python, if I have an
                                                array with values with a
                                                length equal to<br>
                                                >>> the number
                                                of rows in an attribute
                                                table of a (point)
                                                vector layer, how can<br>
                                                >>> I write
                                                those values to a new
                                                column in that attribute
                                                table. I can of<br>
                                                >>> course
                                                first create the column,
                                                but than how to update
                                                that column with the<br>
                                                >>> values in
                                                the array?<br>
                                                >><br>
                                                >><br>
                                                >> it should be
                                                pretty easy to do with
                                                pygrass, unfortunately
                                                there is no<br>
                                                >> example on
                                                assigning attributes in
                                                the official
                                                documentation [1],  but
                                                it<br>
                                                >> should be
                                                pretty easy, something
                                                like that (not tested):<br>
                                                >><br>
                                                >> with
                                                VectorTopo('myvector',
                                                mode='w') as vectormap:<br>
                                                >>     for feature
                                                in vectormap:<br>
                                                >>       
                                                 feature.attrs['mycolumn']
                                                = value<br>
                                                >><br>
                                                >><br>
                                                > Thanks, but that
                                                seems to write the
                                                vector back without
                                                attribute table<br>
                                                <br>
                                              </span>You have to save
                                              the changes in the
                                              database out from your
                                              cycle, with:<br>
                                              <br>
vectormap.table.conn.commit()<br>
                                            </blockquote>
                                            <div><br>
                                            </div>
                                          </span>
                                          <div>Thanks Pietro. I am,
                                            however, not sure I
                                            understand (I tried to use
                                            it, but thanks to my limited
                                            experience in Python /
                                            pygrass not much luck). Just
                                            to be more specific, I am
                                            trying to create a script
                                            that divides points in
                                            training and test groups,
                                            similar to v.kcv, but with
                                            points clustered in space.
                                            E.g.,<br>
                                            <br>
                                            <span
                                              style="font-family:monospace,monospace">#
                                              Create vector<br>
                                              grass.run_command("v.random",


                                              output="testB",
                                              npoints=10,
                                              overwrite=True)<br>
                                              grass.run_command("v.db.addtable",



                                              map="testB", columns="X
                                              DOUBLE PRECISION,Y DOUBLE
                                              PRECISION,GR INTEGER")<br>
                                              grass.run_command("v.to.db",

                                              map="test", option="coor",
                                              columns="X,Y")<br>
                                              <br>
                                              # Create groups<br>
                                              vectmap = 'test'<br>
                                              cvals =
                                              array(grass.vector_db_select(vectmap,
                                              layer = int(1), columns =
'X,Y')['values'].values()).astype(np.float)<br>
                                              centroids,_ =
                                              kmeans(cvals,2)<br>
                                              idx,_ =
                                              vq(cvals,centroids)<br>
                                              <br>
                                            </span></div>
                                          <div><span
                                              style="font-family:monospace,monospace">#
                                              write results to tabel<br>
                                            </span></div>
                                          <div><span
                                              style="font-family:monospace,monospace">Now




                                              I would like to write idx
                                              to the column 'GR' in the
                                              attribute table of 'test'.<br>
                                            </span><br>
                                          </div>
                                          <div>p.s. I am first creating
                                            the XY columns now, but is
                                            there a function to get the
                                            coordinates (cvals) in
                                            pygrass directly?<br>
                                          </div>
                                          <div><br>
                                            <br>
                                          </div>
                                        </div>
                                      </div>
                                    </div>
                                  </blockquote>
                                  <div>I don't fully understand the
                                    example, </div>
                                </div>
                              </div>
                            </div>
                          </blockquote>
                          <br>
                        </div>
                      </div>
                      Thanks for the quick response. I basically have a
                      list with values (idx in the example above) which
                      I like to add as a column to the attribute table
                      of an existing vector (point layer). The length of
                      idx is equal to the number of rows in the
                      attribute table. The solution of Anna seems like
                      an elegant solution (and easier and more flexible
                      than other solutions I tried using e.g., sqlite3).
                      However, as I wrote, I end up with a vector
                      without attribute table. You wrote that I "have to
                      save the changes in the database out from your
                      cycle, with: vectormap.table.conn.commit()". I am,
                      however, not sure what you mean with 'out from
                      your cycle' or how to implement that. <br>
                    </div>
                  </blockquote>
                  <div><br>
                  </div>
                  <div>probably after the for cycle ends you would call
                    this 'vectormap.table.conn.commit()', if it doesn't
                    works, try to put it in the cycle (I am not sure
                    what is supposed to work).</div>
                </div>
              </div>
            </div>
          </blockquote>
          <br>
          I did try both, with no luck so-far. I'll give it another try
          though, perhaps I did something else wrong.<br>
        </blockquote>
        <br>
        Tried out again, but after running the code below, I end up with
        an empty vector layer (no points and no attribute table). Same
        if I put the vectormap.table.conn.commit() in the for cycle.<br>
        <br>
        <pre>import grass.script as grass</pre>
        <pre>from grass.pygrass.vector import VectorTopo</pre>
        <pre>grass.run_command("v.random", output="testB", npoints=10, overwrite=True)</pre>
        <pre>grass.run_command("v.db.addtable", map="testB", columns="GR INTEGER")</pre>
        <pre>with VectorTopo('testB', mode='w') as vectormap:</pre>
        <pre>    for feature in vectormap:</pre>
        <pre>        feature.attrs['GR'] = 9</pre>
        <pre>        vectormap.table.conn.commit()</pre>
        <br>
        <blockquote cite="mid:560C0520.9030509@gmail.com" type="cite">
          <blockquote
cite="mid:CAE0EDEoSucig6AYsdar7O1MSpfFwUiJhttSia7aKPXmZf+qpWA@mail.gmail.com"
            type="cite">
            <div dir="ltr">
              <div class="gmail_extra">
                <div class="gmail_quote">
                  <blockquote class="gmail_quote" style="margin:0px 0px
                    0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                    <div text="#000000" bgcolor="#FFFFFF"><span class="">
                        <br>
                        <blockquote type="cite">
                          <div dir="ltr">
                            <div class="gmail_extra">
                              <div class="gmail_quote">
                                <div>but yes, you can get coordinates:</div>
                                <div><br>
                                </div>
                                <div><font face="monospace, monospace"><span
                                      style="font-size:12.8px">with
                                      VectorTopo('myvector', mode='w')
                                      as vectormap:</span><br
                                      style="font-size:12.8px">
                                    <span style="font-size:12.8px">   
                                      for feature in vectormap:</span><br
                                      style="font-size:12.8px">
                                    <span style="font-size:12.8px">     
                                        print feature.x</span></font><br>
                                </div>
                                <div><span
                                    style="font-family:monospace,monospace;font-size:12.8px"> 
                                          print feature.y</span><font
                                    face="monospace, monospace"><span
                                      style="font-size:12.8px"><br>
                                    </span></font></div>
                              </div>
                            </div>
                          </div>
                        </blockquote>
                        <br>
                      </span> Great, thanks. I did not find this in the
                      manual. If it is not there, perhaps it would be
                      something worth including? I would not mind
                      providing a text, but I am not sure what would be
                      the best way to do that.<br>
                    </div>
                  </blockquote>
                  <div><br>
                  </div>
                  <div>Technically, it's in the manual:</div>
                  <div><a moz-do-not-send="true"
href="https://grass.osgeo.org/grass70/manuals/libpython/pygrass_vector.html#geometry-classes">https://grass.osgeo.org/grass70/manuals/libpython/pygrass_vector.html#geometry-classes</a></div>
                  <div><br>
                  </div>
                  <div>but we are lacking more examples of often used
                    constructions. Some other examples are available in
                    the recent workshop we did:</div>
                  <div><br>
                  </div>
                  <div><a moz-do-not-send="true"
href="https://github.com/wenzeslaus/python-grass-addon/blob/master/02_pygrass_library.ipynb">https://github.com/wenzeslaus/python-grass-addon/blob/master/02_pygrass_library.ipynb</a><br>
                  </div>
                </div>
              </div>
            </div>
          </blockquote>
          <br>
          Thanks, I will have a look at it.<br>
          <blockquote
cite="mid:CAE0EDEoSucig6AYsdar7O1MSpfFwUiJhttSia7aKPXmZf+qpWA@mail.gmail.com"
            type="cite">
            <div dir="ltr">
              <div class="gmail_extra">
                <div class="gmail_quote">
                  <div><br>
                  </div>
                  <blockquote class="gmail_quote" style="margin:0px 0px
                    0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                    <div text="#000000" bgcolor="#FFFFFF"> <br>
                      <blockquote type="cite">
                        <div dir="ltr">
                          <div class="gmail_extra">
                            <div class="gmail_quote">
                              <div> </div>
                              <blockquote class="gmail_quote"
                                style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                                <div dir="ltr">
                                  <div class="gmail_extra">
                                    <div class="gmail_quote">
                                      <div> <br>
                                      </div>
                                      <blockquote class="gmail_quote"
                                        style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span><font
                                            color="#888888"><br>
                                            Pietro<br>
                                          </font></span></blockquote>
                                    </div>
                                    <br>
                                  </div>
                                </div>
                              </blockquote>
                            </div>
                            <br>
                          </div>
                        </div>
                      </blockquote>
                      <br>
                    </div>
                  </blockquote>
                </div>
                <br>
              </div>
            </div>
          </blockquote>
          <br>
        </blockquote>
        <br>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________
grass-dev mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:grass-dev@lists.osgeo.org">grass-dev@lists.osgeo.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://lists.osgeo.org/mailman/listinfo/grass-dev">http://lists.osgeo.org/mailman/listinfo/grass-dev</a></pre>
      </blockquote>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
grass-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:grass-dev@lists.osgeo.org">grass-dev@lists.osgeo.org</a>
<a class="moz-txt-link-freetext" href="http://lists.osgeo.org/mailman/listinfo/grass-dev">http://lists.osgeo.org/mailman/listinfo/grass-dev</a></pre>
    </blockquote>
    <br>
  </body>
</html>