来自两个csv文件的Pandas Groupby

时间:2018-08-24 00:10:26

标签: python pandas pandas-groupby

因此,我正在Datacamp中进行一项练习,告诉您从两个文件中按区域汇总预期寿命。

life_fname,其列为:[“国家”,“预期寿命”]

来源:https://s3.amazonaws.com/assets.datacamp.com/production/course_1650/datasets/life_expectancy.csv

regions_fname,其列为:['Country','Region']

来源: https://s3.amazonaws.com/assets.datacamp.com/production/course_1650/datasets/regions.csv

# Read life_fname into a DataFrame: life
life = pd.read_csv(life_fname, index_col='Country')

# Read regions_fname into a DataFrame: regions
regions = pd.read_csv(regions_fname, index_col='Country')

# Group life by regions['region']: life_by_region
life_by_region = life.groupby(regions['region'])

print(life_by_region)
# Print the mean over the '2010' column of life_by_region
print(life_by_region['2010'].mean())

我了解index_col对一个数据帧的作用,但我不了解的是python如何知道如何在多个数据帧之间找到“公共分母”列['Country']?

我没有明确声明:

life ['Country'] ==地区['Country']。

3 个答案:

答案 0 :(得分:1)

您的怀疑是正确的。 Pandas / Python 100%不会推断该life['Country'] == regions['Country']。如果我错了(我不是熊猫专家),请有人纠正我,但是当您声明life.groupby(regions['region'])时,您是在告诉熊猫做2件基本事情:

第一:熊猫看到您想对regions['region']进行分组。为此,它将regions['region']系列的所有索引映射到它们也属于的任何组。

第二:Pandas将索引从索引映射到组,并将其应用于life数据框的索引。

为什么这样做?纯粹的巧合。起作用的唯一原因是因为(a)您的数据框具有相同的长度,并且(b)您的数据框索引恰好完美融合。因此,这种分组操作确实可以解决,但您应该知道这完全是偶然的。如果您想以一种合理可靠的方式实际执行此操作,则应合并country上的两个Dataframe(或任何适当的方法),然后执行groupby。希望这会有所帮助。

编辑:添加了有关如何正确执行此操作的示例:

pd.merge(life, regions, how='left', left_index=True, 
         right_index=True).groupby('region')['2010'].mean()

答案 1 :(得分:0)

虽然这种分组乍看起来似乎是危险和偶然的,但事实证明它表现得相当不错。

此处的关键是,当您将Series作为分组对象传递给DataFrame.groupby()时,默认情况下,它会在索引上对齐序列。通常,您可以将DataFrame按其自己的列之一进行分组,在这种情况下,实际上可以保证索引的对齐。但是在这种情况下,因为两个DataFrames都将country作为其索引熊猫,因此将life中的值正确地与正确的region对齐并计算了平均值。

两个DataFrames甚至可以有不同的顺序,并且可以具有不同总数的元素,并且计算将正常进行。以下三个示例应说明这一点:

样本数据

import pandas as pd
df1 = pd.DataFrame({'Country': ['A', 'B', 'C', 'D', 'E'], 
                    'val': [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({'Country': ['E', 'D', 'C', 'B', 'A'], 
                    'region': ['region1', 'region1', 'region2', 'region2', 'region2']})
df3 = pd.DataFrame({'Country': ['E', 'D', 'C', 'B'], 
                    'region': ['region1', 'region1', 'region2', 'region2']})
df4 = pd.DataFrame({'Country': ['E', 'D', 'C', 'B', 'A', 'Z'], 
                    'region': ['region1', 'region1', 'region2', 'region2', 'region2', 'region7']})
df1 = df1.set_index('Country')
df2 = df2.set_index('Country')
df3 = df3.set_index('Country')
df4 = df4.set_index('Country')

情况1:

两个DataFrame共享相同的索引,并且具有相同的长度,但是它们的排序方式不同。

df1.groupby(df2.region).mean()
#         val
#region      
#region1  4.5
#region2  2.0

由于该系列首先在索引上对齐,因此仍可以正确计算每个区域的平均值。 region1包含'E''D',其值分别为45

情况2:

分组DataFrame的长度较短,并且不包含DataFrame中要分组的所有国家/地区

df1.groupby(df3.region).mean()
#         val
#region      
#region1  4.5
#region2  2.5

同样,计算正常进行。 'A'没有区域,因此不再包含该区域,并且正确计算了每个区域的平均值。

案例3

与要分组的DataFrame相比,分组DataFrame包含的分组更多

df1.groupby(df3.region).mean()
#         val
#region      
#region1  4.5
#region2  2.0

由于多余的组与分组的DataFrame中的任何行都不对齐,因此不会导致任何输出。

基本上,唯一会引起问题的是如果要与之分组的Series的索引重复。然后pandas无法确定如何正确对齐值。

答案 2 :(得分:0)

It is better to do group by after merging the data frame,it works 
well even index is not same.


 df1 = pd.DataFrame({"Country": ['A', 'B', 'C', 'D', 'E',"F"], 
                "life_expectency": [60, 70, 80, 50, 100,80]})


df2 = pd.DataFrame({"Country": ['E', 'D', 'C', 'B', 'A'], 
                "region": ['region1', 'region1', 'region2', 
                           'region2', 'region2']})

pd.merge(df1,df2,how="left").groupby("region")[2010].mean()

note-taken same dataframes from ALollz answer.