<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>