如何比较数据框中同一列的数据(熊猫)

时间:2020-10-01 05:39:52

标签: python pandas numpy dataframe

我有一个如下所示的熊猫数据框:

Countries dataframe

我想获得其2007年的PIB少于2002年的国家,但是我无法编写仅使用内置方法的Pandas而不使用python迭代或类似方法来做到这一点的代码。 我得到的最多是以下行:

df[df[df.year == 2007].PIB < df[df.year == 2002].PIB].country

但是我收到以下错误消息:

ValueError: Can only compare identically-labeled Series objects

直到现在,我只使用Pandas来过滤来自不同列的数据,但是我不知道如何比较同一列的数据,在这种情况下是年份。 欢迎任何支持。

4 个答案:

答案 0 :(得分:2)

我建议创建Series,其索引为country列,但是对于具有相同索引值的比较系列,在20072002中必须有相同数量的国家/地区:

df = pd.DataFrame({'country': ['Afganistan', 'Zimbabwe', 'Afganistan', 'Zimbabwe'],
                  'PIB': [200, 200, 100, 300], 
                  'year': [2002, 2002, 2007, 2007]})
print (df)
      country  PIB  year
0  Afganistan  200  2002
1    Zimbabwe  200  2002
2  Afganistan  100  2007
3    Zimbabwe  300  2007

df = df.set_index('country')
print (df)
            PIB  year
country              
Afganistan  200  2002
Zimbabwe    200  2002
Afganistan  100  2007
Zimbabwe    300  2007

s1 = df.loc[df.year == 2007, 'PIB'] 
s2 = df.loc[df.year == 2002, 'PIB']
print (s1)
country
Afganistan    100
Zimbabwe      300
Name: PIB, dtype: int64

print (s2)
country
Afganistan    200
Zimbabwe      200
Name: PIB, dtype: int64

countries = s1.index[s1 < s2]
print (countries)
Index(['Afganistan'], dtype='object', name='country')

另一个想法是先绕过DataFrame.pivot,然后再按年查看列,然后与boolean indexing中的索引进行比较:

df1 = df.pivot('country','year','PIB')
print (df1)
year        2002  2007
country               
Afganistan   200   100
Zimbabwe     200   300

countries = df1.index[df1[2007] < df1[2002]]
print (countries)
Index(['Afganistan'], dtype='object', name='country')

答案 1 :(得分:2)

我的策略是使用数据透视表。假设没有两行具有相同的对(“国家”,“年”)。在此假设下,aggfunc=np.sum代表唯一的PIB值。

table = pd.pivot_table(df, values='PIB', index=['country'],
                    columns=['year'], aggfunc=np.sum)[[2002,2007]]
list(table[table[2002] > table[2007]].index)

pivot_table看起来像这样:

The pivot_table looks like this

答案 2 :(得分:1)

尝试以下操作(考虑到您只需要这些国家/地区的列表):

[i for i in df.country if df[(df.country==i) & (df.year==2007)].PIB.iloc[0] < df[(df.country==i) & (df.year==2002)].PIB.iloc[0]]

答案 3 :(得分:1)

这是我的数据框:

df = pd.DataFrame([
    {"country": "a", "PIB": 2, "year": 2002},
    {"country": "b", "PIB": 2, "year": 2002},
    {"country": "a", "PIB": 1, "year": 2007},
    {"country": "b", "PIB": 3, "year": 2007},
])

如果我过滤2002年和2007年这两年的话,我就知道了。

df_2002 = df[df["year"] == 2007]
out : 
  country  PIB  year
0       a    2  2002
1       b    2  2002

df_2007 = df[df["year"] == 2007]
out : 
  country  PIB  year
2       a    1  2007
3       b    3  2007

您想比较每个国家的PIB的发展情况。

Pandas没有意识到这一点,它尝试比较值,但此处基于相同的索引。女巫不是您想要的,并且不可能,因为索引不同。

因此,您只需要使用set_index()

df.set_index("country",  inplace=True)
df_2002 = df[df["year"] == 2007]
out : 
         PIB  year
country           
a          1  2007
b          3  2007

df_2007 = df[df["year"] == 2007]
out : 
         PIB  year
country           
a          2  2002
b          2  2002

现在您可以进行比较

df_2002.PIB > df_2007.PIB
out:
country
a     True
b    False
Name: PIB, dtype: bool

# to get the list of countries
(df_2002.PIB > df_2007.PIB)[res == True].index.values.tolist()
out : 
['a']