【问题标题】:Subtract the minimum value from the maximum value across each row, Python Pandas DataFrame从每行的最大值中减去最小值,Python Pandas DataFrame
【发布时间】:2017-12-17 07:54:30
【问题描述】:

我有一个按州名和县名索引的人口普查数据集,我想遍历每一行以找到标记为“每年人口估计”的所有列的最大值和最小值,然后减去这两个值。我希望该函数返回带有索引和值的 Pandas 系列。

这是我当前的代码:

columns_to_keep=[
    'STNAME',
    'CTYNAME',
    'POPESTIMATE2010',
    'POPESTIMATE2011',
    'POPESTIMATE2012',
    'POPESTIMATE2013',
    'POPESTIMATE2014',
    'POPESTIMATE2015' 
]
df=census_df[columns_to_keep]

def answer_seven(lst):
    lst=[df['POPESTIMATE2010'],df['POPESTIMATE2011'],df['POPESTIMATE2012'],
             df['POPESTIMATE2013'],df['POPESTIMATE2014'],df['POPESTIMATE2015']]

    return max(lst)-min(lst)

answer_seven(lst)

错误信息:

ValueError                                Traceback (most recent call last)
<ipython-input-110-845350b0b5f7> in <module>()
     18     return max(lst)-min(lst)
     19 
---> 20 answer_seven(lst)
     21 

<ipython-input-110-845350b0b5f7> in answer_seven(lst)
     16              df['POPESTIMATE2013'],df['POPESTIMATE2014'],df['POPESTIMATE2015']]
     17 
---> 18     return max(lst)-min(lst)
     19 
     20 answer_seven(lst)

/opt/conda/lib/python3.5/site-packages/pandas/core/generic.py in __nonzero__(self)
    890         raise ValueError("The truth value of a {0} is ambiguous. "
    891                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 892                          .format(self.__class__.__name__))
    893 
    894     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

标签: python pandas dataframe max min


【解决方案1】:

或考虑numpy.ptp 的速度:

沿轴的值范围(最大值 - 最小值)。

np.ptp(df[cols_of_interest].values, axis=1)

【讨论】:

  • 如何使用此代码也返回索引标签?
  • 你可以创建一个系列,pd.Series(np.ptp(df[cols_of_interest].values, axis=1), index=df.index)
  • 我能够找到多年来人口差异最大的县,但 dtype 是 int64。如何让它只返回县名(索引)作为字符串?
【解决方案2】:

熊猫可以直接这样做:

cols_of_interest = ['POPESTIMATE2010', 'POPESTIMATE2011', 'POPESTIMATE2012', 'POPESTIMATE2013', 'POPESTIMATE2014' , 'POPESTIMATE2015']
df[cols_of_interest].max(axis=1) - df[cols_of_interest].min(axis=1)

这将是一个由数据框的原始索引和每行的最大值减去最小值索引的系列

【讨论】:

    【解决方案3】:

    我遇到了需要保留的 NaN 值的问题,并使用了以下内容:

    x = {}
    for col in df_count:
        x[col] = df_count[col].max()- df_count[col].min()
    pd.Series(x)
    

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2019-10-18
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多