如何截断时间序列数据帧中的列,以便删除前导零和尾随零?

2024-09-26 17:46:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下熊猫的时间序列df:

date          value
2015-01-01      0
2015-01-02      0
2015-01-03      0
2015-01-04      3
2015-01-05      0
2015-01-06      4 
2015-01-07      0 

我想删除前导零和尾随零,以便获得以下df:

date          value
2015-01-04      3
2015-01-05      0
2015-01-06      4 

简单地在它们中删除带有0的行会导致删除中间的0,这是我不想要的。

我想写一个前向循环,从第一行开始,然后继续到第一个非0值,第二个后向循环从末尾返回,在最后一个非0值处停止。但这似乎有些过分,有没有更有效的方法


Tags: 方法dfdatevalue时间序列末尾前导
2条回答

一般解决方案返回空数据帧,如果数据中的所有0值与被测掩码的累计和不等于0值,并且通过bitwise AND链接的[::-1]交换值并通过^{}过滤:

s = df['value'].ne(0)
df = df[s.cumsum().ne(0) & s[::-1].cumsum().ne(0)]
print (df)
         date  value
3  2015-01-04      3
4  2015-01-05      0
5  2015-01-06      4

如果始终至少有一个非0值是可能的,则将0转换为缺少的值,并将^{}^{}一起使用,并且 ^{}

s = df['value'].mask(df['value'] == 0)
df = df.loc[s.first_valid_index():s.last_valid_index()]
print (df)
         date  value
3  2015-01-04      3
4  2015-01-05      0
5  2015-01-06      4

另一个想法是使用^{}^{}

s = df['value'].eq(0)
df = df.loc[s.idxmin():s[::-1].idxmin()]
print (df)
         date  value
3  2015-01-04      3
4  2015-01-05      0
5  2015-01-06      4

s = df['value'].ne(0)
df = df.loc[s.idxmax():s[::-1].idxmax()]

您可以获得一个索引列表,其中值为>;大于0,然后查找min

data = [
    ['2015-01-01',      0],
    ['2015-01-02',      0],
    ['2015-01-03',      0],
    ['2015-01-04',      3],
    ['2015-01-05',      0],
    ['2015-01-06',      4]
]
df = pd.DataFrame(data, columns = ['date', 'value'])

print(min(df.index[df['value'] > 0].tolist()))
# 3

然后按如下方式过滤主df:

df.iloc[3:]

或者更好:

df.iloc[min(df.index[df['value'] > 0].tolist()):]

你会得到:

    date        value
3   2015-01-04  3
4   2015-01-05  0
5   2015-01-06  4

相关问题 更多 >

    热门问题