pandas 如何比较 Dataframe 中同一列的数据

jm81lzqq  于 2023-09-29  发布在  其他
关注(0)|答案(4)|浏览(122)

我有一个Panda的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过滤不同列的数据,但我不知道如何比较同一列的数据,在本例中是年份。

6ss1mwsb

6ss1mwsb1#

我的策略是使用pivot_table。假设没有两行具有相同的('country','year')对。在此假设下,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看起来像这样:

lo8azlld

lo8azlld2#

我建议创建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')
edqdpe6u

edqdpe6u3#

下面是我的dataframe:

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']
edqdpe6u

edqdpe6u4#

试试这个(考虑到你只需要这些国家的列表):

[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]]

相关问题