因此,我正在Datacamp中进行一项练习,告诉您从两个文件中按区域汇总预期寿命。
来源:https://s3.amazonaws.com/assets.datacamp.com/production/course_1650/datasets/life_expectancy.csv
来源: 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']。
答案 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')
两个DataFrame共享相同的索引,并且具有相同的长度,但是它们的排序方式不同。
df1.groupby(df2.region).mean()
# val
#region
#region1 4.5
#region2 2.0
由于该系列首先在索引上对齐,因此仍可以正确计算每个区域的平均值。 region1
包含'E'
和'D'
,其值分别为4
和5
分组DataFrame
的长度较短,并且不包含DataFrame
中要分组的所有国家/地区
df1.groupby(df3.region).mean()
# val
#region
#region1 4.5
#region2 2.5
同样,计算正常进行。 'A'
没有区域,因此不再包含该区域,并且正确计算了每个区域的平均值。
与要分组的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.