我有一个如下所示的熊猫数据框:
我想获得其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来过滤来自不同列的数据,但是我不知道如何比较同一列的数据,在这种情况下是年份。 欢迎任何支持。
答案 0 :(得分:2)
我建议创建Series
,其索引为country
列,但是对于具有相同索引值的比较系列,在2007
和2002
中必须有相同数量的国家/地区:>
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看起来像这样:
答案 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']