Python 通过将相同值过滤三次或三次以上来过滤每一列

Python 通过将相同值过滤三次或三次以上来过滤每一列,python,pandas,Python,Pandas,我有一个包含日期作为索引的数据集,每一列都是一个项目的名称,其值为count。我正试图找出如何过滤连续3天以上每一列的计数为零的每一列。我正在考虑使用for循环,非常感谢您的帮助。我在这个项目中使用python 我对python相当陌生,到目前为止,我尝试使用for循环,但没有让它以任何方式工作 for i in a.index: if a.loc[i,'name']==3==df.loc[i+1,'name']==df.loc[i+2,'name']: print(a.

我有一个包含日期作为索引的数据集,每一列都是一个项目的名称,其值为count。我正试图找出如何过滤连续3天以上每一列的计数为零的每一列。我正在考虑使用for循环,非常感谢您的帮助。我在这个项目中使用python

我对python相当陌生,到目前为止,我尝试使用for循环,但没有让它以任何方式工作

for i in a.index:
    if a.loc[i,'name']==3==df.loc[i+1,'name']==df.loc[i+2,'name']:
        print(a.loc[i,"name"])

如果没有频率,则无法向时间戳添加整数值。

如果在问题中包含示例数据帧和所需的输出,则效果会更好。请下次再来。这样,我必须猜测您的数据是什么样子,并且可能无法回答您的问题。我假设这些值是整数。您的数据帧是否每天都有一行?我认为情况可能并非如此。我会让最后几天的每一天都有一个连续。我创建了如下示例数据框:

import pandas as pd
import numpy as np
import datetime

# Here I am just creating random data from your description
delta = 365
start_date = datetime.datetime.now() - datetime.timedelta(days=delta)
end_date = datetime.datetime.now()
datetimes = [end_date - diff for diff in [datetime.timedelta(days=i) for i in range(delta,0,-1)]]
# This is the list of dates we will have in our final dataframe (includes all days)
dates = pd.Series([date.strftime('%Y-%m-%d') for date in datetimes], name='Date', dtype='datetime64[ns]')
# random integer dataframe
df = pd.DataFrame(np.random.randint(0, 5, size=(delta,4)), columns=['item' + str(i) for i in range(4)])
df = pd.concat([df, dates], axis=1).set_index('Date')
# Create a missing day
df = df.drop(df.loc['2019-08-01'].name)
# Reindex so that index has all consecutive days
df = df.reindex(index=dates)
现在我们有了一个示例数据帧,剩下的就简单了。我将检查数据帧中的值是否等于0,然后在窗口为4(>3)的情况下求和。这样我可以避免for循环。结果数据帧包含所有行,其中至少有一个项在4个连续行中的值为0。如果有一个0表示多个窗口连续行,它将显示为两行,其中日期仅相隔一天。我希望这是有道理的

# custom function as I want "np.nan" returned if a value does not equal "test_value" 
def equals(df_value, test_value=0):
    return 1 if df_value == test_value else np.nan
# apply the function to every value in the dataframe
# for each row, calculate the sum of four subsequent rows (>3)
df = df.applymap(equals).rolling(window=4).sum()
# if there was np.nan in the sum, the sum is np.nan, so it can be dropped
# keep the rows where there is at least 1 value
df = df.dropna(thresh=1)
# drop all columns that don't have any values
df = df.dropna(thresh=1, axis=1)

请提供样本数据(文本形式)和预期输出。这将有助于更快地回答您的问题。非常感谢您,我刚刚开始编写代码并使用Stackoverflow,因此我确信如何提问,这肯定有很大帮助。另一个问题,我是否应该避免在数据帧分析中使用循环?如果我看到某人是新手,我可以花更多时间解释和回答。我不想让任何人泄气。我的观点是,一个好的问题能在更短的时间内得到更好的答案。Re:对于循环,如果使用pandas,最好不要迭代数据帧。熊猫在引擎盖下使用cython和矢量化操作。避免for循环将使您的代码更加高效,在处理较大的数据集时,这是一个良好的习惯。