【问题标题】:How do I create a function that will return a value in a dictionary for each row within a data sheet using Python?如何使用 Python 创建一个函数,该函数将在字典中为数据表中的每一行返回一个值?
【发布时间】:2019-10-31 04:11:09
【问题描述】:

我需要在我的表中为状态区域创建一个新列,该列为每一行数据(每个数据行都有一个状态)填充一个区域。如何编写一个函数来调用每个行项的字典?

我有大约 30,000 个行项目,我相信循环会花费太长时间。我确信有一些方法可以用字典来做到这一点。我尝试使用不同的方法来调用它,但似乎无法让它填充正确的数据。

states = {
        'AK': 'Alaska',
        'AL': 'Alabama',
        'AR': 'Arkansas',
        'AZ': 'Arizona',
        'CA': 'California',
        'CO': 'Colorado',
        'CT': 'Connecticut',
        'DC': 'District of Columbia',
        'DE': 'Delaware',
        'FL': 'Florida',
        'GA': 'Georgia',
        'HI': 'Hawaii',
        'IA': 'Iowa',
        'ID': 'Idaho',
        'IL': 'Illinois',
        'IN': 'Indiana',
        'KS': 'Kansas',
        'KY': 'Kentucky',
        'LA': 'Louisiana',
        'MA': 'Massachusetts',
        'MD': 'Maryland',
        'ME': 'Maine',
        'MI': 'Michigan',
        'MN': 'Minnesota',
        'MO': 'Missouri',
        'MS': 'Mississippi',
        'MT': 'Montana',
        'NC': 'North Carolina',
        'ND': 'North Dakota',
        'NE': 'Nebraska',
        'NH': 'New Hampshire',
        'NJ': 'New Jersey',
        'NM': 'New Mexico',
        'NV': 'Nevada',
        'NY': 'New York',
        'OH': 'Ohio',
        'OK': 'Oklahoma',
        'OR': 'Oregon',
        'PA': 'Pennsylvania',
        'RI': 'Rhode Island',
        'SC': 'South Carolina',
        'SD': 'South Dakota',
        'TN': 'Tennessee',
        'TX': 'Texas',
        'UT': 'Utah',
        'VA': 'Virginia',
        'VT': 'Vermont',
        'WA': 'Washington',
        'WI': 'Wisconsin',
        'WV': 'West Virginia',
        'WY': 'Wyoming'
}

state_abbrev = {v: k for k, v in states.items()}

state_code = {
    'AK': '10','AL': '4', 'AR': '9', 'AR': '6', 'CA': '9', 'CO': '8',  'CT': '1', 'DC': '3', 'DE': '3', 'FL': '4',
'GA': '4', 'HI': '9', 'IA': '7', 'ID': '10', 'IL': '5', 'IN': '5', 'KS': '7', 'KY': '4', 'LA': '6', 
'MA': '1', 'MD': '3', 'ME': '1', 'MI': '5', 'MN': '5','MO': '7', 'MS': '4', 'MT': '8', 'NC': '4', 
'ND': '8', 'NE': '7', 'NH': '1', 'NJ': '2', 'NM': '6','NV': '9', 'NY': '2', 'OH': '5', 'OK': '6', 
'OR': '10', 'PA': '3', 'PR': '2', 'RI': '1', 'SC': '4', 'SD': '8', 'TN': '4', 'TX': '6', 'UT': '8',
'VA': '3', 'VI': '2', 'VT': '1', 'WA': '10', 'WI': '5', 'WV': '3', 'WY': '8', 'PI': '9'
    }

state_region = {v: k for k, v in state_code.items()}

def get_region(): return [state_region[i] for i in fulldf['state']]

fulldf["Region"] = get_region() fulldf.tail()

返回键错误“MA”,预计会返回一个名为“Region”的新列,该列填充列出的每个“状态”的区域。

KeyError                                  Traceback (most recent call last)
<ipython-input-338-6afc1e48556a> in <module>
 33     return [state_region[i] for i in fulldf['state']]
 34 
---> 35 fulldf["Region"] = get_region()
 36 fulldf.tail()
 37 

<ipython-input-338-6afc1e48556a> in get_region()
 31 
 32 def get_region():
---> 33     return [state_region[i] for i in fulldf['state']]
 34 
 35 fulldf["Region"] = get_region()

<ipython-input-338-6afc1e48556a> in <listcomp>(.0)
 31 
 32 def get_region():
---> 33     return [state_region[i] for i in fulldf['state']]
 34 
 35 fulldf["Region"] = get_region()

KeyError: 'MA'

【问题讨论】:

  • 首先看起来你在你的函数中打印状态并且从不返回任何东西,所以你在倒数第二行的分配将是 None
  • 你在打印而不是return-ing。
  • @Chris 谢谢。固定的。但它仍然返回错误的数据
  • @harvpan 在我修复它之后它仍然返回错误的数据。有任何想法吗?我是编码的菜鸟
  • 你能用固定代码更新问题吗?请看minimal reproducible example

标签: python pandas numpy dictionary jupyter-notebook


【解决方案1】:

您的get_region 函数存在缺陷。应该是:

def get_region():
    return [state_region[i] for i in fulldf['state']]

Python 推导式已经优化到足以使该函数适用于 30k 长度的数据帧。

【讨论】:

  • 我应该先问你fulldf['state']的内容是什么,df['Region']的预期内容是什么。我希望我能猜到,但我猜错了。
  • region 是一个 int,包含在上面的字典 state_code 中。 'state' 的内容是州的缩写,就像上面的任何字典一样。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多