【问题标题】:Pandas: Iterate over rows and find frequency of occurancesPandas:遍历行并查找出现频率
【发布时间】:2016-11-30 22:24:08
【问题描述】:

我有一个包含 2 列和 3000 行的数据框。

第一列以时间步长表示时间。例如第一行是 0,第二行是 1,...,最后一行是 2999。

第二列代表压力。当我们遍历行时压力会发生变化,但会表现出重复的行为。所以每隔几步我们就会看到它达到最小值(即 375),然后再次上升,然后再次上升到 375,以此类推。

我想在 Python 中做的是遍历行并查看: 1)我们看到压力最小的时间步长

2)找出最小值之间的频率。

import numpy as np
import pandas as pd
import numpy.random as rnd
import scipy.linalg as lin
from matplotlib.pylab import *
import re
from pylab import *
import datetime

df = pd.read_csv('test.csv')
row = next(df.iterrows())[0]
dataset = np.loadtxt(df, delimiter=";")

df.columns = ["Timestamp", "Pressure"]
print(df[[0, 1]])

【问题讨论】:

    标签: python loops pandas


    【解决方案1】:

    您不需要逐行迭代,您可以将整列与min 值进行比较以屏蔽它,然后您可以使用该屏蔽找到时间步长diff:

    数据设置:

    In [44]:
    df = pd.DataFrame({'timestep':np.arange(20), 'value':np.random.randint(375, 400, 20)})
    df
    
    Out[44]:
        timestep  value
    0          0    395
    1          1    377
    2          2    392
    3          3    396
    4          4    377
    5          5    379
    6          6    384
    7          7    396
    8          8    380
    9          9    392
    10        10    395
    11        11    393
    12        12    390
    13        13    393
    14        14    397
    15        15    396
    16        16    393
    17        17    379
    18        18    396
    19        19    390
    

    通过将列与min 值进行比较来掩盖df:

    In [45]:    
    df[df['value']==df['value'].min()]
    
    Out[45]:
       timestep  value
    1         1    377
    4         4    377
    

    我们可以使用带有loc的掩码来找到对应的'timestep'值,并使用diff来查找区间差异:

    In [48]:    
    df.loc[df['value']==df['value'].min(),'timestep'].diff()
    
    Out[48]:
    1    NaN
    4    3.0
    Name: timestep, dtype: float64
    

    您可以将以上内容除以 1/60 以找到频率为 1 分钟或您想要的任何频率单位

    【讨论】:

    • 感谢您的回答 EdChum。我想知道,如何根据我已有的值在value 字段中分配压力值?你用np.random.randit做了一个例子,但我不知道如何用已经存在的来做。
    • 对不起,我的 df 只是一个模型,因为我没有你的数据,你可以用你的替换我代码中的列名
    • 我还有一个问题:如果我想将列与特定值(例如 380)进行比较而不是最小值,我该如何屏蔽 DF?
    • 语义相同df[df['value']==380]需要看boolean indexing
    • 是的,它有效,非常感谢您的帮助!顺便说一句,由于我的 DF 太长,无法看到控制台中的所有行,你知道是否有办法在其他地方打印输出,以便我可以看到所有间隔差异?
    猜你喜欢
    • 2019-06-28
    • 2020-12-08
    • 2014-11-29
    • 2021-06-18
    • 1970-01-01
    • 2020-04-05
    • 2019-10-26
    • 2017-09-23
    相关资源
    最近更新 更多