[英]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.loc
與DataFrame.first_valid_index
和DataFrame.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.idxmax
或DataFrame.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.