3 回答

TA贡献1828条经验 获得超13个赞
您可以使用函数式编程的功能,并将函数应用于每一列。这可能会加快速度。同样,当您timestamps看起来已排序时,可以将它们用作Datarame的索引。
df.set_index('timestamp', inplace=True)
final = []
def func(col):
first = col.first_valid_index()
last = col.last_valid_index()
final.append(col.loc[first:last])
return
df.apply(func)
另外,您可以将所有东西压紧在一个衬里中:
final = []
df.apply(lambda col: final.append(col.loc[col.first_valid_index() : col.last_valid_index()]))

TA贡献1880条经验 获得超4个赞
一种想法是在将索引设置为之后使用列表或字典理解timestamp。您应该对数据进行测试,以查看这是否可以解决性能问题。如果您的限制是内存,则不太可能有帮助。
df = df.set_index('timestamp')
final = {col: df[col].loc[df[col].first_valid_index(): df[col].last_valid_index()] \
for col in df}
print(final)
{'col1': timestamp
2018-01-01 08:00:00 1.0
2018-01-01 10:00:00 2.0
2018-01-01 12:00:00 3.0
2018-01-01 14:00:00 4.0
2018-01-01 16:00:00 5.0
2018-01-01 18:00:00 6.0
2018-01-01 20:00:00 7.0
2018-01-01 22:00:00 8.0
Name: col1, dtype: float64,
...
'col4': timestamp
2018-01-01 02:00:00 -2.0
2018-01-01 04:00:00 -1.0
2018-01-01 06:00:00 0.0
2018-01-01 08:00:00 1.0
2018-01-01 10:00:00 2.0
2018-01-01 12:00:00 3.0
2018-01-01 14:00:00 4.0
Name: col4, dtype: float64}

TA贡献1845条经验 获得超8个赞
我的方法是NaN为每列及其倒数找到的累加总和,并过滤那些大于的条目0。然后,我进行dict理解以为每一列返回一个数据框(如果您愿意,可以将其更改为列表)。
例如,我们有
cols = [c for c in df.columns if c!='timestamp']
result_dict = {c: df[(df[c].notnull().cumsum() > 0) &
(df.ix[::-1,c].notnull().cumsum()[::-1] > 0)][['timestamp', c]]
for c in cols}
添加回答
举报