Find max and min values from a table based on two fields Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Selection on Feature layer (geoprocessing)Using ListFields and CalculateField to find max value in variable number of fields to populate another field?How to group numbers based on first digits and then find min/max?Debugging syntax error (invalid syntax) from arcpy.SelectLayerByAttribute_management()?Debugging RuntimeError: A column was specified that does not exist from ArcPy?Iterate through a list to use then use SearchCursor to populate new listPass list parameter to SQL expressionSetting up where_clause to select counties one at a time from feature class using ArcPy?SQL Query Syntax gives ERROR 000358: Invalid expression?Finding many intersecting polygons of one layer and listing them in single field using ArcGIS Desktop?
How much damage would a cupful of neutron star matter do to the Earth?
Semigroups with no morphisms between them
Customizing QGIS plugins
Sum letters are not two different
An adverb for when you're not exaggerating
What does Turing mean by this statement?
Dynamic filling of a region of a polar plot
What is an "asse" in Elizabethan English?
Random body shuffle every night—can we still function?
What initially awakened the Balrog?
How many morphisms from 1 to 1+1 can there be?
Why are my pictures showing a dark band on one edge?
Project Euler #1 in C++
Co-worker has annoying ringtone
Drawing spherical mirrors
What order were files/directories output in dir?
Karn the great creator - 'card from outside the game' in sealed
Why is it faster to reheat something than it is to cook it?
How would a mousetrap for use in space work?
1-probability to calculate two events in a row
Would it be easier to apply for a UK visa if there is a host family to sponsor for you in going there?
How does Belgium enforce obligatory attendance in elections?
How can I prevent/balance waiting and turtling as a response to cooldown mechanics
If Windows 7 doesn't support WSL, then what is "Subsystem for UNIX-based Applications"?
Find max and min values from a table based on two fields
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?Selection on Feature layer (geoprocessing)Using ListFields and CalculateField to find max value in variable number of fields to populate another field?How to group numbers based on first digits and then find min/max?Debugging syntax error (invalid syntax) from arcpy.SelectLayerByAttribute_management()?Debugging RuntimeError: A column was specified that does not exist from ArcPy?Iterate through a list to use then use SearchCursor to populate new listPass list parameter to SQL expressionSetting up where_clause to select counties one at a time from feature class using ArcPy?SQL Query Syntax gives ERROR 000358: Invalid expression?Finding many intersecting polygons of one layer and listing them in single field using ArcGIS Desktop?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I have a geodatabase table with the following fields: County_Name, State_Name, Date_Time, Customers
Example
Alameda, CA, 8/1/2014 12AM, 6
Alameda, CA, 8/1/2014 1AM, 1
Alameda, CA, 8/1/2014 2AM, 3
....
Data for all US counties is in the table. I just want to create a new table that contains the
- county, state, max customers for the day (24 hour period), time of the max customers
- county, state, min customers for the day (24 hour period), time of the min customers
Many states have the same county names as other states.
Do I need to create a cursor to obtain a list of the unique county and state names first?
This will give me a list of the county names but I also need the state names.
with arcpy.da.SearchCursor(tablesMerged, ["county_nam"]) as cursor:
print sorted(row[0] for rows in cursor)
arcpy cursor attribute-joins
|
show 3 more comments
I have a geodatabase table with the following fields: County_Name, State_Name, Date_Time, Customers
Example
Alameda, CA, 8/1/2014 12AM, 6
Alameda, CA, 8/1/2014 1AM, 1
Alameda, CA, 8/1/2014 2AM, 3
....
Data for all US counties is in the table. I just want to create a new table that contains the
- county, state, max customers for the day (24 hour period), time of the max customers
- county, state, min customers for the day (24 hour period), time of the min customers
Many states have the same county names as other states.
Do I need to create a cursor to obtain a list of the unique county and state names first?
This will give me a list of the county names but I also need the state names.
with arcpy.da.SearchCursor(tablesMerged, ["county_nam"]) as cursor:
print sorted(row[0] for rows in cursor)
arcpy cursor attribute-joins
Are you looking for a whole script or a few hints how to accomplish this?
– Stophface
Aug 12 '14 at 18:44
Just a few hints would be great! Thanks. I haven't used Python in a little while but I think I would be able to get going with a few hints.
– Andrew
Aug 12 '14 at 18:46
3
the most straightforward is to use the built in "summary statistics" tools with several case fields
– radouxju
Aug 12 '14 at 19:38
That may work. I didn't know it allowed for multiple case fields. I will give that a shot! Thanks.
– Andrew
Aug 12 '14 at 19:56
I agree with @radouxju - Summary Statistics could save you a lot of code here, and should also run faster.
– PolyGeo♦
Aug 12 '14 at 21:46
|
show 3 more comments
I have a geodatabase table with the following fields: County_Name, State_Name, Date_Time, Customers
Example
Alameda, CA, 8/1/2014 12AM, 6
Alameda, CA, 8/1/2014 1AM, 1
Alameda, CA, 8/1/2014 2AM, 3
....
Data for all US counties is in the table. I just want to create a new table that contains the
- county, state, max customers for the day (24 hour period), time of the max customers
- county, state, min customers for the day (24 hour period), time of the min customers
Many states have the same county names as other states.
Do I need to create a cursor to obtain a list of the unique county and state names first?
This will give me a list of the county names but I also need the state names.
with arcpy.da.SearchCursor(tablesMerged, ["county_nam"]) as cursor:
print sorted(row[0] for rows in cursor)
arcpy cursor attribute-joins
I have a geodatabase table with the following fields: County_Name, State_Name, Date_Time, Customers
Example
Alameda, CA, 8/1/2014 12AM, 6
Alameda, CA, 8/1/2014 1AM, 1
Alameda, CA, 8/1/2014 2AM, 3
....
Data for all US counties is in the table. I just want to create a new table that contains the
- county, state, max customers for the day (24 hour period), time of the max customers
- county, state, min customers for the day (24 hour period), time of the min customers
Many states have the same county names as other states.
Do I need to create a cursor to obtain a list of the unique county and state names first?
This will give me a list of the county names but I also need the state names.
with arcpy.da.SearchCursor(tablesMerged, ["county_nam"]) as cursor:
print sorted(row[0] for rows in cursor)
arcpy cursor attribute-joins
arcpy cursor attribute-joins
edited Jan 12 '18 at 9:32
PolyGeo♦
54k1782246
54k1782246
asked Aug 12 '14 at 18:27
AndrewAndrew
199313
199313
Are you looking for a whole script or a few hints how to accomplish this?
– Stophface
Aug 12 '14 at 18:44
Just a few hints would be great! Thanks. I haven't used Python in a little while but I think I would be able to get going with a few hints.
– Andrew
Aug 12 '14 at 18:46
3
the most straightforward is to use the built in "summary statistics" tools with several case fields
– radouxju
Aug 12 '14 at 19:38
That may work. I didn't know it allowed for multiple case fields. I will give that a shot! Thanks.
– Andrew
Aug 12 '14 at 19:56
I agree with @radouxju - Summary Statistics could save you a lot of code here, and should also run faster.
– PolyGeo♦
Aug 12 '14 at 21:46
|
show 3 more comments
Are you looking for a whole script or a few hints how to accomplish this?
– Stophface
Aug 12 '14 at 18:44
Just a few hints would be great! Thanks. I haven't used Python in a little while but I think I would be able to get going with a few hints.
– Andrew
Aug 12 '14 at 18:46
3
the most straightforward is to use the built in "summary statistics" tools with several case fields
– radouxju
Aug 12 '14 at 19:38
That may work. I didn't know it allowed for multiple case fields. I will give that a shot! Thanks.
– Andrew
Aug 12 '14 at 19:56
I agree with @radouxju - Summary Statistics could save you a lot of code here, and should also run faster.
– PolyGeo♦
Aug 12 '14 at 21:46
Are you looking for a whole script or a few hints how to accomplish this?
– Stophface
Aug 12 '14 at 18:44
Are you looking for a whole script or a few hints how to accomplish this?
– Stophface
Aug 12 '14 at 18:44
Just a few hints would be great! Thanks. I haven't used Python in a little while but I think I would be able to get going with a few hints.
– Andrew
Aug 12 '14 at 18:46
Just a few hints would be great! Thanks. I haven't used Python in a little while but I think I would be able to get going with a few hints.
– Andrew
Aug 12 '14 at 18:46
3
3
the most straightforward is to use the built in "summary statistics" tools with several case fields
– radouxju
Aug 12 '14 at 19:38
the most straightforward is to use the built in "summary statistics" tools with several case fields
– radouxju
Aug 12 '14 at 19:38
That may work. I didn't know it allowed for multiple case fields. I will give that a shot! Thanks.
– Andrew
Aug 12 '14 at 19:56
That may work. I didn't know it allowed for multiple case fields. I will give that a shot! Thanks.
– Andrew
Aug 12 '14 at 19:56
I agree with @radouxju - Summary Statistics could save you a lot of code here, and should also run faster.
– PolyGeo♦
Aug 12 '14 at 21:46
I agree with @radouxju - Summary Statistics could save you a lot of code here, and should also run faster.
– PolyGeo♦
Aug 12 '14 at 21:46
|
show 3 more comments
1 Answer
1
active
oldest
votes
Since you said you just need a hint with python I came up with this:
My test table:
import arcpy
arcpy.env.workspace = "..." #on windows use \
#SEARCHCURSOR
#SearchCursor (in_table, field_names, where_clause, spatial_reference, explode_to_points, sql_clause)"""
stable = "test2.shp"
sfield = ["county", "state", "date", "Customers"]
namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield)) #a set is a collection type which does not allow duplicates
#since there are a lot of duplicates (countynames) we only want each countyname once
#more information on sets can be found here http://www.python-course.eu/sets_frozensets.php
print "Countynames without duplicates: ", namesdb
"""
I only left that in for better understanding what is basically happening in the generator above
The namesdb = set(row.....) replaces all of this:
names = []
namesdb = []
with arcpy.da.SearchCursor(stable, sfield) as scursor: #search for the county names
for srow in scursor:
names.append(srow[0]) #append all found countynames to a list
print "duplicates: ", names
for i in names: #get rid of dublicates in statenames
if i not in namesdb:
namesdb.append(i) #create new list without duplicates
print "without duplicates: ", namesdb
"""
countylist = #create a dict where elements from namesdb are the KEYS
for name in namesdb:
countylist[name] = []
print "dict: ", countylist
with arcpy.da.SearchCursor(stable, sfield) as scursor:
for srow in scursor:
for county in namesdb: #iterate through the namesdb list
if srow [0] == county: #get the value of each defined column in sfield for each row of countyname
countylist[county].append(srow) #append to the matching KEY in dictionary
else:
continue
print "dict with values: ", countylist
from operator import itemgetter
#now the trickiest part (for me, cause I am a python beginner, and that really hurt my head). I went to SO to ask a question. See here for better underatanding whats happening: http://stackoverflow.com/questions/25288927/finding-the-max-value-of-list-in-dictionary?noredirect=1#comment39411443_25288927
maxcostumers = k: max(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns max number of customers, if customers is the last column in your table. If not, adjust the -1
mincostumers = k: min(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns the min number of customers, as see above
print "row from table with max costumers: ", maxcostumers
print "row from table with min costumers: ", mincostumers
Thats the Output generated:
ountynames without duplicates: set([u'New_York', u'Jersy', u'Alameda'])
dict: u'New_York': [], u'Jersy': [], u'Alameda': []
dict with values:
u'New_York': [(u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 4), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3)],
u'Jersy': [(u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6), (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7)],
u'Alameda': [(u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 2), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)]
row from table with max costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3)
row from table with min costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)
Then you only need an UpdateCursor and the formatting for the time.
Information regarding this you will find here:
http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000014000000
and
http://resources.arcgis.com/en/help/main/10.1/index.html#//001700000046000000
2
Since dictionaries are orderless, you can just useset()
to remove duplicates. You can pass a generator expression directly to it, a lanamesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.
– Paul
Aug 12 '14 at 20:49
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "79"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f110310%2ffind-max-and-min-values-from-a-table-based-on-two-fields%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Since you said you just need a hint with python I came up with this:
My test table:
import arcpy
arcpy.env.workspace = "..." #on windows use \
#SEARCHCURSOR
#SearchCursor (in_table, field_names, where_clause, spatial_reference, explode_to_points, sql_clause)"""
stable = "test2.shp"
sfield = ["county", "state", "date", "Customers"]
namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield)) #a set is a collection type which does not allow duplicates
#since there are a lot of duplicates (countynames) we only want each countyname once
#more information on sets can be found here http://www.python-course.eu/sets_frozensets.php
print "Countynames without duplicates: ", namesdb
"""
I only left that in for better understanding what is basically happening in the generator above
The namesdb = set(row.....) replaces all of this:
names = []
namesdb = []
with arcpy.da.SearchCursor(stable, sfield) as scursor: #search for the county names
for srow in scursor:
names.append(srow[0]) #append all found countynames to a list
print "duplicates: ", names
for i in names: #get rid of dublicates in statenames
if i not in namesdb:
namesdb.append(i) #create new list without duplicates
print "without duplicates: ", namesdb
"""
countylist = #create a dict where elements from namesdb are the KEYS
for name in namesdb:
countylist[name] = []
print "dict: ", countylist
with arcpy.da.SearchCursor(stable, sfield) as scursor:
for srow in scursor:
for county in namesdb: #iterate through the namesdb list
if srow [0] == county: #get the value of each defined column in sfield for each row of countyname
countylist[county].append(srow) #append to the matching KEY in dictionary
else:
continue
print "dict with values: ", countylist
from operator import itemgetter
#now the trickiest part (for me, cause I am a python beginner, and that really hurt my head). I went to SO to ask a question. See here for better underatanding whats happening: http://stackoverflow.com/questions/25288927/finding-the-max-value-of-list-in-dictionary?noredirect=1#comment39411443_25288927
maxcostumers = k: max(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns max number of customers, if customers is the last column in your table. If not, adjust the -1
mincostumers = k: min(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns the min number of customers, as see above
print "row from table with max costumers: ", maxcostumers
print "row from table with min costumers: ", mincostumers
Thats the Output generated:
ountynames without duplicates: set([u'New_York', u'Jersy', u'Alameda'])
dict: u'New_York': [], u'Jersy': [], u'Alameda': []
dict with values:
u'New_York': [(u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 4), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3)],
u'Jersy': [(u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6), (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7)],
u'Alameda': [(u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 2), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)]
row from table with max costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3)
row from table with min costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)
Then you only need an UpdateCursor and the formatting for the time.
Information regarding this you will find here:
http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000014000000
and
http://resources.arcgis.com/en/help/main/10.1/index.html#//001700000046000000
2
Since dictionaries are orderless, you can just useset()
to remove duplicates. You can pass a generator expression directly to it, a lanamesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.
– Paul
Aug 12 '14 at 20:49
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
add a comment |
Since you said you just need a hint with python I came up with this:
My test table:
import arcpy
arcpy.env.workspace = "..." #on windows use \
#SEARCHCURSOR
#SearchCursor (in_table, field_names, where_clause, spatial_reference, explode_to_points, sql_clause)"""
stable = "test2.shp"
sfield = ["county", "state", "date", "Customers"]
namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield)) #a set is a collection type which does not allow duplicates
#since there are a lot of duplicates (countynames) we only want each countyname once
#more information on sets can be found here http://www.python-course.eu/sets_frozensets.php
print "Countynames without duplicates: ", namesdb
"""
I only left that in for better understanding what is basically happening in the generator above
The namesdb = set(row.....) replaces all of this:
names = []
namesdb = []
with arcpy.da.SearchCursor(stable, sfield) as scursor: #search for the county names
for srow in scursor:
names.append(srow[0]) #append all found countynames to a list
print "duplicates: ", names
for i in names: #get rid of dublicates in statenames
if i not in namesdb:
namesdb.append(i) #create new list without duplicates
print "without duplicates: ", namesdb
"""
countylist = #create a dict where elements from namesdb are the KEYS
for name in namesdb:
countylist[name] = []
print "dict: ", countylist
with arcpy.da.SearchCursor(stable, sfield) as scursor:
for srow in scursor:
for county in namesdb: #iterate through the namesdb list
if srow [0] == county: #get the value of each defined column in sfield for each row of countyname
countylist[county].append(srow) #append to the matching KEY in dictionary
else:
continue
print "dict with values: ", countylist
from operator import itemgetter
#now the trickiest part (for me, cause I am a python beginner, and that really hurt my head). I went to SO to ask a question. See here for better underatanding whats happening: http://stackoverflow.com/questions/25288927/finding-the-max-value-of-list-in-dictionary?noredirect=1#comment39411443_25288927
maxcostumers = k: max(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns max number of customers, if customers is the last column in your table. If not, adjust the -1
mincostumers = k: min(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns the min number of customers, as see above
print "row from table with max costumers: ", maxcostumers
print "row from table with min costumers: ", mincostumers
Thats the Output generated:
ountynames without duplicates: set([u'New_York', u'Jersy', u'Alameda'])
dict: u'New_York': [], u'Jersy': [], u'Alameda': []
dict with values:
u'New_York': [(u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 4), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3)],
u'Jersy': [(u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6), (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7)],
u'Alameda': [(u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 2), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)]
row from table with max costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3)
row from table with min costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)
Then you only need an UpdateCursor and the formatting for the time.
Information regarding this you will find here:
http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000014000000
and
http://resources.arcgis.com/en/help/main/10.1/index.html#//001700000046000000
2
Since dictionaries are orderless, you can just useset()
to remove duplicates. You can pass a generator expression directly to it, a lanamesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.
– Paul
Aug 12 '14 at 20:49
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
add a comment |
Since you said you just need a hint with python I came up with this:
My test table:
import arcpy
arcpy.env.workspace = "..." #on windows use \
#SEARCHCURSOR
#SearchCursor (in_table, field_names, where_clause, spatial_reference, explode_to_points, sql_clause)"""
stable = "test2.shp"
sfield = ["county", "state", "date", "Customers"]
namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield)) #a set is a collection type which does not allow duplicates
#since there are a lot of duplicates (countynames) we only want each countyname once
#more information on sets can be found here http://www.python-course.eu/sets_frozensets.php
print "Countynames without duplicates: ", namesdb
"""
I only left that in for better understanding what is basically happening in the generator above
The namesdb = set(row.....) replaces all of this:
names = []
namesdb = []
with arcpy.da.SearchCursor(stable, sfield) as scursor: #search for the county names
for srow in scursor:
names.append(srow[0]) #append all found countynames to a list
print "duplicates: ", names
for i in names: #get rid of dublicates in statenames
if i not in namesdb:
namesdb.append(i) #create new list without duplicates
print "without duplicates: ", namesdb
"""
countylist = #create a dict where elements from namesdb are the KEYS
for name in namesdb:
countylist[name] = []
print "dict: ", countylist
with arcpy.da.SearchCursor(stable, sfield) as scursor:
for srow in scursor:
for county in namesdb: #iterate through the namesdb list
if srow [0] == county: #get the value of each defined column in sfield for each row of countyname
countylist[county].append(srow) #append to the matching KEY in dictionary
else:
continue
print "dict with values: ", countylist
from operator import itemgetter
#now the trickiest part (for me, cause I am a python beginner, and that really hurt my head). I went to SO to ask a question. See here for better underatanding whats happening: http://stackoverflow.com/questions/25288927/finding-the-max-value-of-list-in-dictionary?noredirect=1#comment39411443_25288927
maxcostumers = k: max(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns max number of customers, if customers is the last column in your table. If not, adjust the -1
mincostumers = k: min(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns the min number of customers, as see above
print "row from table with max costumers: ", maxcostumers
print "row from table with min costumers: ", mincostumers
Thats the Output generated:
ountynames without duplicates: set([u'New_York', u'Jersy', u'Alameda'])
dict: u'New_York': [], u'Jersy': [], u'Alameda': []
dict with values:
u'New_York': [(u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 4), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3)],
u'Jersy': [(u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6), (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7)],
u'Alameda': [(u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 2), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)]
row from table with max costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3)
row from table with min costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)
Then you only need an UpdateCursor and the formatting for the time.
Information regarding this you will find here:
http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000014000000
and
http://resources.arcgis.com/en/help/main/10.1/index.html#//001700000046000000
Since you said you just need a hint with python I came up with this:
My test table:
import arcpy
arcpy.env.workspace = "..." #on windows use \
#SEARCHCURSOR
#SearchCursor (in_table, field_names, where_clause, spatial_reference, explode_to_points, sql_clause)"""
stable = "test2.shp"
sfield = ["county", "state", "date", "Customers"]
namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield)) #a set is a collection type which does not allow duplicates
#since there are a lot of duplicates (countynames) we only want each countyname once
#more information on sets can be found here http://www.python-course.eu/sets_frozensets.php
print "Countynames without duplicates: ", namesdb
"""
I only left that in for better understanding what is basically happening in the generator above
The namesdb = set(row.....) replaces all of this:
names = []
namesdb = []
with arcpy.da.SearchCursor(stable, sfield) as scursor: #search for the county names
for srow in scursor:
names.append(srow[0]) #append all found countynames to a list
print "duplicates: ", names
for i in names: #get rid of dublicates in statenames
if i not in namesdb:
namesdb.append(i) #create new list without duplicates
print "without duplicates: ", namesdb
"""
countylist = #create a dict where elements from namesdb are the KEYS
for name in namesdb:
countylist[name] = []
print "dict: ", countylist
with arcpy.da.SearchCursor(stable, sfield) as scursor:
for srow in scursor:
for county in namesdb: #iterate through the namesdb list
if srow [0] == county: #get the value of each defined column in sfield for each row of countyname
countylist[county].append(srow) #append to the matching KEY in dictionary
else:
continue
print "dict with values: ", countylist
from operator import itemgetter
#now the trickiest part (for me, cause I am a python beginner, and that really hurt my head). I went to SO to ask a question. See here for better underatanding whats happening: http://stackoverflow.com/questions/25288927/finding-the-max-value-of-list-in-dictionary?noredirect=1#comment39411443_25288927
maxcostumers = k: max(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns max number of customers, if customers is the last column in your table. If not, adjust the -1
mincostumers = k: min(v, key=itemgetter(-1)) for k, v in countylist.iteritems() #returns the min number of customers, as see above
print "row from table with max costumers: ", maxcostumers
print "row from table with min costumers: ", mincostumers
Thats the Output generated:
ountynames without duplicates: set([u'New_York', u'Jersy', u'Alameda'])
dict: u'New_York': [], u'Jersy': [], u'Alameda': []
dict with values:
u'New_York': [(u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 4), (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3)],
u'Jersy': [(u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6), (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7)],
u'Alameda': [(u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 2), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3), (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)]
row from table with max costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 10),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 7),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 3)
row from table with min costumers:
u'New_York': (u'New_York', u'NY', datetime.datetime(2014, 8, 13, 0, 0), 3),
u'Jersy': (u'Jersy', u'JY', datetime.datetime(2014, 8, 13, 0, 0), 6),
u'Alameda': (u'Alameda', u'CA', datetime.datetime(2014, 8, 13, 0, 0), 1)
Then you only need an UpdateCursor and the formatting for the time.
Information regarding this you will find here:
http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000014000000
and
http://resources.arcgis.com/en/help/main/10.1/index.html#//001700000046000000
edited Apr 11 at 17:17
Glorfindel
3011311
3011311
answered Aug 12 '14 at 20:39
StophfaceStophface
1,19811540
1,19811540
2
Since dictionaries are orderless, you can just useset()
to remove duplicates. You can pass a generator expression directly to it, a lanamesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.
– Paul
Aug 12 '14 at 20:49
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
add a comment |
2
Since dictionaries are orderless, you can just useset()
to remove duplicates. You can pass a generator expression directly to it, a lanamesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.
– Paul
Aug 12 '14 at 20:49
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
2
2
Since dictionaries are orderless, you can just use
set()
to remove duplicates. You can pass a generator expression directly to it, a la namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.– Paul
Aug 12 '14 at 20:49
Since dictionaries are orderless, you can just use
set()
to remove duplicates. You can pass a generator expression directly to it, a la namesdb = set(row[0] for row in arcpy.da.SearchCursor(stable, sfield))
.– Paul
Aug 12 '14 at 20:49
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
@Paul thanks for the further input. Ill check that tomorrow.
– Stophface
Aug 12 '14 at 22:12
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
Thank you! I will try and test this out today or tomorrow.
– Andrew
Aug 13 '14 at 13:20
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
@Andrew I updated my answere
– Stophface
Aug 13 '14 at 16:03
add a comment |
Thanks for contributing an answer to Geographic Information Systems Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f110310%2ffind-max-and-min-values-from-a-table-based-on-two-fields%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Are you looking for a whole script or a few hints how to accomplish this?
– Stophface
Aug 12 '14 at 18:44
Just a few hints would be great! Thanks. I haven't used Python in a little while but I think I would be able to get going with a few hints.
– Andrew
Aug 12 '14 at 18:46
3
the most straightforward is to use the built in "summary statistics" tools with several case fields
– radouxju
Aug 12 '14 at 19:38
That may work. I didn't know it allowed for multiple case fields. I will give that a shot! Thanks.
– Andrew
Aug 12 '14 at 19:56
I agree with @radouxju - Summary Statistics could save you a lot of code here, and should also run faster.
– PolyGeo♦
Aug 12 '14 at 21:46