簡體   English   中英

如何截斷 Pandas 時間序列數據框中的列以刪除前導零和尾隨零?

[英]How to truncate a column in a Pandas time series data frame so as to remove leading and trailing zeros?

我在 Pandas 中有以下時間序列 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 值處停止。 但這似乎有點矯枉過正,有沒有更有效的方法呢?

通用解決方案返回空數據幀,如果數據中的所有0值與測試的掩碼累積總和不等於0值,並且由[::-1]交換的值通過bitwise AND鏈接並通過boolean indexing過濾:

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值是可能的, DataFrame.first_valid_index 0轉換為缺失值並將DataFrame.locDataFrame.first_valid_indexDataFrame.last_valid_index

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

另一個想法是使用DataFrame.idxmaxDataFrame.idxmin

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()]

您可以獲取 value > than 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM