每个功能框将是一批数据。我想提取col几何中关键“坐标”的所有值,并将其迭代地插入另一个df中。
使用相同的df,我还想存储从属性col中提取的数据。属性col有许多键。
每个源框架都将具有“ geometry”(几何):“ coordinates”(坐标)和“ properties”(属性),它们将由各种键组成。
此新DataFrame中的每个col将是'geometry'或'properties'内部的键。
例如:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<select>
<option value="1">Jan</option>
<option value="2">Feb</option>
<option value="3">Mar</option>
<option value="4">Apr</option>
<option value="5">May</option>
<option value="6">Jun</option>
<option value="7">Jul</option>
<option value="8">Aug</option>
<option value="9">Sept</option>
<option value="10">Oct</option>
<option value="11">Nov</option>
<option value="12">Dec</option>
</select>
我可以通过以下两种方式访问这两个列:
coordinates name
0 [-108.600,39.09] 'Target'
1 [51.459,82.04] 'Costco'
2 [-35.459,82.04] 'BJ's Wholesale Club'
3 [98.459,12.07] 'Walgreens'
4 [105.404,96.04] 'Walmart
但这只会将框架分为两部分。通常,如果我这样做了:
coord_frame = features_frame['geometry'][:]
properties_frame = features_frame['properties'][:]
如果我这样做的话,我将获得所有行的几何col中坐标轴的值:
Feature_Frame['geometry'][:]['coordinates']
我将在所有行的属性col中获得名称键的值。
相反,我只是遇到一个关键错误,说名称或坐标不存在。
答案 0 :(得分:1)
/usr/bin/gcc
构造函数 pd.DataFrame
是Python级别的循环,除了它通常表现不佳简单的列表理解。更好的主意是使用pd.Series.apply
构造函数中使用的优化代码。这是一个示例:
pd.DataFrame
df = pd.DataFrame({'geometry': [{'coordinates': [-108.600,39.09], 'name': 'Target'},
{'coordinates': [51.459,82.04], 'name': 'Costco'}]})
print(df)
geometry
0 {'coordinates': [-108.6, 39.09], 'name': 'Targ...
1 {'coordinates': [51.459, 82.04], 'name': 'Cost...
res = pd.DataFrame(df['geometry'].values.tolist())
print(res)
coordinates name
0 [-108.6, 39.09] Target
1 [51.459, 82.04] Costco
用于多个系列的字典以上内容可以扩展到任意系列的字典:
concat
答案 1 :(得分:0)
关于
df_new = pd.DataFrame()
然后例如
df_new['coordinates'] = features_frame['geometry'].apply(lambda x: x['coordinates'])
或
df_new['name'] = features_frame['properties'].apply(lambda x: x['name'])
如果您想使用所有键进行操作,则可以在第一行中遍历示例字典的键:
for key in features_frame.geometry[0]:
df_new[key] = features_frame.geometry.apply(lambda x: x[key])
for key in features_frame.properties[0]:
df_new[key] = features_frame.properties.apply(lambda x: x[key])
补充:
...以防万一geometry
-和properties
-dict中有相同的键,您可以在创建新列以防止覆盖时轻松修饰它们:
for ...
df_new['geom_' + key] = ...
for ...
df_new['prop_' + key] = ...
编辑:
如果某列中的某些词典没有所有键,则使用默认值,例如None
应该返回。
为此,只需在lambda函数中使用get
方法即可定义默认值,而无需编制索引:
lambda x: x.get(key, None)
这至少是解决关键错误的正确方法。
但是,如果由于第一行中的dict不代表所有dict而导致代码没有遍历所有键,那么首先必须创建所有键的列表。
进入此列表有多种可能性:
理想情况下,您已经知道其他地方的所有键。然后,您可以将它们放在列表中并对其进行遍历,而不是对第一个字典进行遍历。
也许您知道至少有一个字典的键最多,而最长的字典具有所有键,而较短的字典的键在同一列中始终是子集。然后您可以找到
longest_dict = sorted(df.geometry, key=len)[-1]
也许您对按键一无所知。因此,您必须收集出现在列中任意位置的所有不同键:
all_keys = []
for d in df.geometry:
all_keys.extend(d)
all_keys = set(all_keys)