在Python中查找三列的最大值和最小值

6
我想知道如何在Python中找到三列最大值和最小值之间的差异(列名为POPESTIMATE2010-POPESTIMATE2012)。然后,我应该在所有记录中找到最大的结果。换句话说,哪个县在2010年至2012年期间人口变化的绝对值最大?
例如,如果三年期间县人口分别是100、80、130,则其最大变化为|130-80|=50。
这是我的代码:enter image description here
import pandas as pd
census_df = pd.read_csv('census.csv')

def answer_one():
    return ((census_df['POPESTIMATE2010'],census_df ['POPESTIMATE2011'],census_df ['POPESTIMATE2012']).max()-(census_df['POPESTIMATE2010'],census_df ['POPESTIMATE2011'],census_df ['POPESTIMATE2012']).min()).max()

answer_one()

这是DataFrame中唯一的三列吗? - elPastor
5个回答

7

我不确定最终结果应该是什么,但如果你想得到具有最大差值(即最大值与最小值之间的差)的列,则可以按照以下方式操作:

>>> df = pd.DataFrame({'a':[3,4,6], 'b':[22,15,6], 'c':[7,18,9]})
>>> df
   a   b   c
0  3  22   7
1  4  15  18
2  6   6   9
>>> diff = df.max() - df.min()
>>> diff
a     3
b    16
c    11
dtype: int64
>>> diff.nlargest(1)
b    16
dtype: int64

如果您只需要一个数字,则

>>> diff.max()
16

如果您想获取每行最大值和最小值之间的差异,则只需在不同的 上执行即可:

>>> diff = df.max(axis=1) - df.min(axis=1)
>>> diff
0    19
1    14
2     3
>>> diff.max()
19

但是我相信,根据你的数字,Saeed 希望结果是 19(22-3),而不是 16。 - elPastor
1
轴=1 使聚合计算每行的最大/最小值,而不是每列的最大/最小值。 - Roman Pekar
@RomanPekar:我认为你的代码对所有列都进行了最大/最小值计算。但是我想要针对3列进行计算。实际上,我想知道哪个县在2010-2012年期间人口变化的绝对值最大?例如,如果该县在3年内的人口分别为100、120、80、105、100、130,则其在该时期内的最大变化量为|130-80|=50。 - user1492588
@saeedtalaee - 那么你的函数会返回一个列表或元组中的三个数字吗? - elPastor
那么@saeedtalaee,您的意思是每个县可以有多行数据?您不想先计算每年的县人口吗? 总之,我不确定您如何在三年期间拥有六个不同的人口值。 - Roman Pekar
显示剩余12条评论

3
import pandas as pd
d = {'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}
df = pd.DataFrame(d)

def answer_one():
    max_1 = max(df.max())
    min_1 = min(df.min())
    return max_1 - min_1

print answer_one()

如果您想使用一组选择的列:

max_1 = max(df[['a','b']].max())

1
为什么要使用列表?max(df.max())的作用相同,min同理。 - Copperfield
你说得完全正确,Copperfield。谢谢。已编辑答案。 - elPastor

1

max(list)可以得到列表中的最大元素。

min(list)可以得到列表中的最小元素。

其他部分我认为应该很容易理解!


我根据我的代码使用了最大值和最小值,但是我无法提取它。 - user1492588
1
你必须使用 max(list) 这样的形式,而不是 list.max()。 - user126885

1
你需要先清理数据,只保留所需列。然后转置数据框,并从中获取最大值和最小值之间的差异,最后从 diff 系列中获取 idxmax
import pandas as pd
census_df = pd.read_csv('census.csv')
ans_df = census_df[census_df["SUMLEV"] == 50]    
ans_df = ans_df[["STNAME", "CTYNAME", "POPESTIMATE2010", "POPESTIMATE2011", "POPESTIMATE2012"]]
ans_df = ans_df.set_index(["STNAME", "CTYNAME"])
diff = ans_df.T.max() - ans_df.T.min()
diff.idxmax()[1]

0

我曾经遇到过同样的问题,但我已经解决了:

f1 = census_df[census_df['SUMLEV'] == 50].set_index(['STNAME','CTYNAME'])
f1 = f1.ix[:,'POPESTIMATE2010','POPESTIMATE2011','POPESTIMATE2012','POPESTIMATE2013'
,'POPESTIMATE2014','POPESTIMATE2015']].stack()
f2 = f1.max(level=['STNAME','CTYNAME']) - f1.min(level=['STNAME','CTYNAME'])
return f2.idxmax()[1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接