如何遍历DataFrame行并从cols中的字典中获取值?

时间:2018-11-15 06:43:26

标签: python pandas dictionary dataframe

Features_Frame

每个功能框将是一批数据。我想提取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中获得名称键的值。

相反,我只是遇到一个关键错误,说名称或坐标不存在。

2 个答案:

答案 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而导致代码没有遍历所有键,那么首先必须创建所有键的列表。
进入此列表有多种可能性:

  1. 理想情况下,您已经知道其他地方的所有键。然后,您可以将它们放在列表中并对其进行遍历,而不是对第一个字典进行遍历。

  2. 也许您知道至少有一个字典的键最多,而最长的字典具有所有键,而较短的字典的键在同一列中始终是子集。然后您可以找到

    longest_dict = sorted(df.geometry, key=len)[-1]
    
  3. 也许您对按键一无所知。因此,您必须收集出现在列中任意位置的所有不同键:

    all_keys = []
    for d in df.geometry:
        all_keys.extend(d)
    all_keys = set(all_keys)