如何分组整理数据

时间:2019-07-15 10:21:13

标签: python pandas data-cleaning

我有一个非常长的数据帧,其中包含很多数据,需要清除这些数据才能继续进行数据可视化。我有几件事需要做,我可以在一定程度上做到每件事,但是我不知道如何或者甚至不可能一起做。

这就是我要做的:

  1. 查找每年的最高到达人数,并查看运输方式是空运,海运还是陆运。
    period  arv_count Mode of arrival
0   2013-01  984350         Air
1   2013-01  129074         Sea
2   2013-01  178294         Land
3   2013-02  916372         Air
4   2013-02  125634         Sea
5   2013-02  179359         Land
6   2013-03  1026312    Air
7   2013-03  143194         Sea
8   2013-03  199385         Land
...   ...      ...          ...
78  2015-03  940077     Air
79  2015-03  133632         Sea
80  2015-03  127939     Land
81  2015-04  939370     Air
82  2015-04  118120     Sea
83  2015-04  151134     Land
84  2015-05  945080     Air
85  2015-05  123136     Sea
86  2015-05  154620     Land
87  2015-06  930642     Air
88  2015-06  115631     Sea
89  2015-06  138474     Land

这是数据外观的一个示例。我不知道是否有必要,但是我仅在一年中创建了另一列,如下所示:

def year_extract(year):
    return year.split('-')[0].strip()

df1 = pd.DataFrame(df['period'])

df1 = df1.rename(columns={'period':'Year'})

df1 = df1['Year'].apply(year_extract)
df1 = pd.DataFrame(df1)

df = pd.merge(df, df1, left_index= True, right_index= True)

我知道如何使用groupby,也知道如何找到最大值,但是我不知道是否可以在组中找到最大值,例如在2013、2014、2015等中找到最高到达计数

以上数据是基于运输方式和期间的所有国家的总到达计数,但是原始数据还包含另外的数百行,其中指出了该地区和国家,但我删除了,因为我不知道如何使用或清洁它们。看起来像这样:

period     region     country     moa     arv_count
2013-01     Total      Total      Air      984350
2013-01     Total      Total      Sea      129074
2013-01     Total      Total      Land     178294
2013-02     Total      Total      Air      916372
...      ...    ...       ...       ...
2015-12    AMERICAS     USA       Land      2698
2015-12    AMERICAS    Canada     Land       924
2013-01     ASIA        China     Air      136643
2013-01     ASIA        India     Air       55369
2013-01     ASIA        Japan     Air       51178

如果可能的话,我也想利用区域数据。希望创建一个聚集的柱状图,以7个区域为x轴,到达计数为y轴,每个区域显示通过陆,海和空到达的计数,但是我觉得有太多我不知道的多余数据现在该如何处理。

例如,我不知道如何处理时期和国家,因为我所需要的只是基于地区和年份的陆地,海洋和空中到达的总数,而与国家和月份无关。

1 个答案:

答案 0 :(得分:1)

我使用此数据框来测试代码(您问题中的那个):

df = pd.DataFrame([['2013-01',     'Total',      'Total',      'Air',      984350],
['2013-01',     'Total',      'Total',      'Sea',      129074],
['2013-01',     'Total',      'Total',      'Land',     178294],
['2013-02',     'Total',      'Total',     'Air',      916372],
['2015-12',    'AMERICAS',     'USA',       'Land',      2698],
['2015-12',    'AMERICAS',    'Canada',     'Land',       924],
['2013-01',     'ASIA',        'China',     'Air',      136643],
['2013-01',     'ASIA',        'India',     'Air',       55369],
['2013-01',     'ASIA',        'Japan',     'Air',       51178]],
columns = ['period', 'region', 'country', 'moa', 'arv_count'])

这里是获取按年,地区和类型(海,陆,空)划分的到达总数的代码:

首先添加“年份”列:

df['year'] = pd.to_datetime(df['period']).dt.year

然后按(年,地区,moa)分组,然后在每组中添加arv_count:

df.groupby(['region', 'year', 'moa']).arv_count.sum()

以下是输出:

region    year  moa 
AMERICAS  2015  Land       3622
ASIA      2013  Air      243190
Total     2013  Air     1900722
                Land     178294
                Sea      129074

我希望这就是您想要的!