【问题标题】:How to apply function to object attribute for every row in pandas如何将函数应用于熊猫中每一行的对象属性
【发布时间】:2020-02-28 02:26:03
【问题描述】:

我在 pandas 中有一个表,其中每一行都是一个具有属性的对象。每个对象看起来像

{'type': 'Feature',
 'properties': {'GEO_ID': '0400000US23',
  'STATE': '23',
  'NAME': 'Maine',
  'LSAD': '',
  'CENSUSAREA': 30842.923}}

我想遍历每一行并在 properties 字典中添加一个名为 TERPS 的属性,使其看起来像

{'type': 'Feature',
 'properties': {'GEO_ID': '0400000US23',
  'STATE': '23',
  'NAME': 'Maine',
  'LSAD': '',
  'CENSUSAREA': 30842.923,
  'TERPS': 82}}                   <----- new attribute

TERPS 属性的值应该来自另一个字典 counts,看起来像

California              1161
New York                 601
Florida                  588
Minnesota                533
Maryland                 463
Washington               438
Texas                    363
Pennsylvania             356
Ohio                     348

我可以为一行做到这一点:

df.iloc[0]['properties']['TERPS'] = counts[df.iloc[0]['properties']['NAME']]

但是如何对所有行执行此操作?这将获得每一行的值,但我正在努力分配它。

df.apply(lambda x : counts[x['properties']['NAME']], axis=1)

【问题讨论】:

  • lambda x: x['properties']['TERPS'] = counts[x['properties']['NAME']] ?
  • 抛出“lambda 不能包含赋值”错误
  • 您能否分享带有预期输出的熊猫数据框。您可以添加额外的细节而无需遍历每一行。

标签: python pandas lambda apply


【解决方案1】:

您不能在lambda 中使用=,但您可以在可以与apply() 一起使用的函数中执行此操作。

def change(x):
    x['properties']['TERPS'] = counts[x['properties']['NAME']]

df.apply(change)

最小的工作示例

import pandas as pd

counts = {'Maine': 83}

data = {'A': [{'type': 'Feature',
  'properties': {'GEO_ID': '0400000US23',
  'STATE': '23',
  'NAME': 'Maine',
  'LSAD': '',
  'CENSUSAREA': 30842.923}}]}

df = pd.DataFrame(data)

def change(x):
    x['properties']['TERPS'] = counts[x['properties']['NAME']]

df['A'].apply(change)

print(df['A'].iloc[0]['properties'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2017-08-23
    • 2018-08-15
    • 2020-04-09
    • 2020-01-15
    • 2022-01-15
    相关资源
    最近更新 更多