在 Python 中使用 pandas 格式化数据类别

数据挖掘 Python 熊猫 数据框
2022-02-21 17:04:21

我想将大约 9500 个城市放入 pandas 数据框中,然后存储在文件中以备后用。例如,下面这些是我有数据的 3 个城市。一些大小范围基于年份。Lovell_Wyoming 只有 9 年的数据点,对应于年份,而 Wheatland 和 Worland 有 15 年。

我最初的想法是将定量数据(纵火..年份)放入地图中,然后将城市名称作为键放入更大的地图中,并带有定量数据。以这种方式构建更大的地图。然后,将地图转换为数据框,然后转换为 csv。我对熊猫有点缺乏经验,所以我不确定如何正确地做到这一点,如果这甚至是最好的方法。

归根结底,我希望将这些数据保存在一个 csv 文件中,通过将其加载到数据框中并调用我需要的任何值,可以轻松访问该文件。

City 'Lovell_Wyoming' 
Arson [0, 0, 0, 0, 0, 0, 0, 1, 0] 
Assaults [6, 6, 3, 4, 3, 28, 3, 2, 2] 
Auto_thefts [1, 1, 1, 0, 0, 1, 2, 0, 1] 
Burglaries [6, 11, 5, 2, 0, 15, 11, 7, 7] 
Murders [0, 0, 0, 0, 1, 0, 0, 0, 0] 
Rapes [0, 0, 3, 0, 0, 1, 1, 0, 1] 
Robberies [0, 0, 0, 0, 0, 0, 0, 1, 0] 
Thefts [23, 49, 35, 39, 28, 37, 54, 35, 10] 
Year [2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2014]

City 'Wheatland_Wyoming' 
Arson [0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0] 
Assaults [9, 2, 6, 5, 6, 6, 2, 4, 2, 4, 3, 11, 5, 4, 8] 
Auto_thefts [4, 8, 3, 3, 4, 4, 5, 3, 4, 6, 4, 8, 12, 7, 3] 
Burglaries [17, 17, 14, 9, 10, 17, 12, 26, 51, 12, 15, 21, 32, 31, 13] 
Murders [1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0] 
Rapes [0, 0, 0, 4, 2, 1, 2, 0, 2, 1, 1, 0, 2, 0, 0] 
Robberies [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
Thefts [109, 95, 146, 81, 108, 100, 82, 85, 106, 128, 48, 85, 66, 56, 47] 
Year [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016]

City 'Worland_Wyoming' 
Arson [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
Assaults [12, 17, 19, 17, 11, 15, 16, 2, 9, 1, 4, 7, 2, 1, 3] 
Auto_thefts [2, 1, 2, 1, 1, 8, 1, 1, 1, 0, 1, 0, 0, 0, 1] 
Burglaries [6, 10, 10, 10, 9, 10, 10, 0, 6, 1, 0, 2, 0, 11, 18] 
Murders [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
Rapes [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3] 
Robberies [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
Thefts [44, 41, 47, 29, 30, 25, 27, 27, 23, 30, 36, 45, 54, 46, 43] 
Year [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016]

如果我格式化的方式有点奇怪,我提前道歉!如果您想了解更多信息,请告诉我。

1个回答

我就是这样做的。然而,一个 DataFrame 可以以最适合您需求的多种方式构建。我相信这种方法具有最大的灵活性,因为您可以轻松地使用分组功能在旅途中重新构造这种格式。

首先,您需要以与 Python 兼容的方式设置数据。我使用字典词典

cities = {'Lovell_Wyoming':
          {'Crimes':
           {
            'Arson': [0, 0, 0, 0, 0, 0, 0, 1, 0],
            'Assaults': [6, 6, 3, 4, 3, 28, 3, 2, 2] ,
            'Auto_thefts': [1, 1, 1, 0, 0, 1, 2, 0, 1] ,
            'Burglaries': [6, 11, 5, 2, 0, 15, 11, 7, 7] ,
            'Murders': [0, 0, 0, 0, 1, 0, 0, 0, 0] ,
            'Rapes': [0, 0, 3, 0, 0, 1, 1, 0, 1] ,
            'Robberies': [0, 0, 0, 0, 0, 0, 0, 1, 0] ,
            'Thefts': [23, 49, 35, 39, 28, 37, 54, 35, 10]
           },
            'Years': [2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2014]
          },

         'Wheatland_Wyoming':
          {'Crimes':
           {
            'Arson': [0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0] ,
            'Assaults': [9, 2, 6, 5, 6, 6, 2, 4, 2, 4, 3, 11, 5, 4, 8] ,
            'Auto_thefts': [4, 8, 3, 3, 4, 4, 5, 3, 4, 6, 4, 8, 12, 7, 3] ,
            'Burglaries': [17, 17, 14, 9, 10, 17, 12, 26, 51, 12, 15, 21, 32, 31, 13] ,
            'Murders': [1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0] ,
            'Rapes': [0, 0, 0, 4, 2, 1, 2, 0, 2, 1, 1, 0, 2, 0, 0] ,
            'Robberies': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ,
            'Thefts': [109, 95, 146, 81, 108, 100, 82, 85, 106, 128, 48, 85, 66, 56, 47]
            },
              'Years': [2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016]
            }
         }

然后将此数据编译成 DataFrame 的行

data = []
for city in cities:
    for ix, year in enumerate(cities[city]['Years']):
        for crime in cities[city]['Crimes']:
            temp = {'City':city, 
                    'Crime':crime, 
                    'Year':year, 
                    'Count':cities[city]['Crimes'][crime][ix]}
            data.append(temp)

然后进入DataFrame结构为。

import pandas as pd
df = pd.DataFrame(data=data)
df

在此处输入图像描述


查询

然后,您可以通过多种方式查询此 DataFrame,例如,如果您想了解 2002 年的纵火案,您会这样做

df[(df['Crime']=='Arson') & (df['Year']==2002)]

在此处输入图像描述

数数

您可以将多年来的纵火次数计算为

df[(df['Crime']=='Arson')].groupby(['City'])['Count'].agg('sum')

City
Lovell_Wyoming 1
Wheatland_Wyoming 3
名称:Count,dtype:int64


将 DataFrame 写入 CSV 文件

这可以直接完成

df.to_csv('filename.csv')