【问题标题】:Print the first value of a dataframe based on condition, then iterate to the next sequence根据条件打印数据帧的第一个值,然后迭代到下一个序列
【发布时间】:2019-09-10 04:49:04
【问题描述】:

我希望针对 100 年来的选定美国地点(尤其是 8 个地点)对 100 年的气候数据进行数据分析。我有一个pandas dataFrame 设置了最高温度、最低温度、平均温度、降雪量、总降水量以及日、年和月值的列(然后,我还有一个基于日期时间值的索引) .现在,我想设置一个 for 循环来打印每年 90 华氏度或更高的第一个最高温度,但只有第一个。最终,我想将其缩小到我的 8 个位置中的每一个,但首先我只想让 for 循环工作。

对 for 循环的各种迭代进行了实验。

for year in range(len(climate['Year'])):    
           if (climate['Max'][year] >=90).all():
                print (climate.index[year])
                break

不出所料,我提供的循环输出打印了第一个 90 度日周期(从 1919 年开始,即我的数据框的开始)并中断。

for year in range(len(climate['Year'])):    
           if (climate['Max'][year] >=90).all():
                print (climate.index[year])
                break

1919-06-12 00:00:00

没关系。如果我拿出休息声明,所有的 90 度日都会打印出来,包括同一年的多个日。我只想打印每年的第一个值。我是否需要设置第二个 for 循环以在一年中递增?如果我在尝试循环通过计数器时明确说明年份,如下所示,循环仍然从 1919 年开始,最终达到越界索引。我知道这个逻辑是错误的。

count = 1919

while count < 2019:
    for year in range(len(climate['Year'])):    
        if (climate[climate['Year']==count]['Max'][year] >=90).all():
                print (climate.index[year])
                count = count+1

真诚感谢您的任何意见。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    您无需第二个 for 循环即可实现此目的。假设 climate 数据帧按时间顺序排列,这应该可以满足您的要求:

    current_year = None
    for i in range(climate.shape[0]):
        if climate['Max'][i] >= 90 and climate['Year'][i] != current_year:
            print(climate.index[i])
            current_year = climate['Year'][i]
    

    请注意,我们正在使用 current_year 变量来跟踪我们已经为其打印结果的最近一年。然后,在 if 检查中,我们正在检查是否已经打印了循环中当前行的年份的结果。

    这是一种方法,但我建议您查看pandas.DataFrame.groupby,因为我认为它非常适合您的用例。您可以获得一个包含每年前 >=90 天的数据框,其中包含以下内容(再次假设 climate 按时间顺序排列):

    climate[climate.Max >= 90].groupby('Year').first()
    

    这只是过滤数据框以仅包含 >=90 最大天数,将同一年的行分组在一起,并仅保留每个组中的第一行。如果您有一个额外的列 Location,您可以扩展它以获得相同的列,除了每年的每个位置:

    climate[climate.Max >= 90].groupby(['Location', 'Year']).first()
    

    【讨论】:

    • .first() 函数非常棒。正是我所需要的(我可以通过“城市”将其拆分以获得每个位置的除外)。我很尴尬,我没有早点找到这个,但我非常感谢你花时间指出这一点,谢谢!
    • 请问,对于您提供的 for 循环,我遇到了与我之前的一些 for 循环相同的问题:ValueError:系列的真值是模糊的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。我需要在列调用之后放置 .all() 吗?这些列都是由没有缺失值的整数组成的。
    • 有趣,我有点困惑为什么你的循环中有.all()climate['Max'][i] 的类型不只是一个 int 吗?该错误似乎表明climate['Max'][i]pd.Series
    • 在这个简单的例子中循环对我来说很好:climate = pd.DataFrame({ 'Max': [91, 92, 92], 'Year': [2019, 2019, 2020], 'Month': [4, 4, 4], 'Day': [1, 2, 3]}).
    • 您的示例数据框也适用于我。 'Max' 和 'Year' 是 dtype int32。然而,如果不添加 .all() 或 .any(),我无法让循​​环工作,我怀疑这会使循环花费额外的时间来处理。也许这与我正在使用的数据(或大量数据)有关。令人沮丧,但我应该能够解决它。
    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 2016-04-17
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多