【发布时间】:2019-06-06 17:16:02
【问题描述】:
我正在努力处理一些数据按摩过程。 我正在考虑一种在数据框中查找和删除不变条目的最佳方法。
我有来自移动设备的信号电平数据
measDate measLatitude measLongitude measCellId measNetTypeDetail measOperatorCode measSignalLevel
2019-06-05 00:22:10.791 27.676038 84.177025 14603 13 42902 -97
2019-06-05 00:22:11.806 27.676038 84.177025 14603 13 42902 -97
2019-06-05 00:22:14.179 27.676038 84.177025 14604 13 42902 -97
2019-06-05 00:22:14.279 27.676038 84.177025 14604 13 42902 -97
2019-06-05 00:22:16.657 27.676038 84.177025 14604 13 42902 -97
2019-06-05 00:22:18.904 27.676038 84.177025 14615 13 42902 -96
2019-06-05 00:22:21.276 27.676038 84.177025 14615 13 42902 -96
2019-06-05 00:22:23.557 27.676038 84.177025 14614 13 42902 -95
2019-06-05 00:22:24.796 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:26.768 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:27.787 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:28.802 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:31.803 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:33.799 27.676038 84.177025 14603 10 42902 -96
所以基本上是 signalLevel 和一些相关的数据 + 时间戳
我需要做的是通过以下方式过滤数据:
- 如果过去 n 个样本的信号电平没有变化(例如,n=3 个样本)
- 如果其他值也没有变化
- 过滤掉数据。
所以最后我希望在一行中有最多 n 个相同的样本。
WINDOW N=3 的预期结果
measDate measLatitude measLongitude measCellId measNetTypeDetail measOperatorCode measSignalLevel
2019-06-05 00:22:10.791 27.676038 84.177025 14603 13 42902 -97
2019-06-05 00:22:11.806 27.676038 84.177025 14603 13 42902 -97
2019-06-05 00:22:14.179 27.676038 84.177025 14604 13 42902 -97
2019-06-05 00:22:18.904 27.676038 84.177025 14615 13 42902 -96
2019-06-05 00:22:21.276 27.676038 84.177025 14615 13 42902 -96
2019-06-05 00:22:23.557 27.676038 84.177025 14614 13 42902 -95
2019-06-05 00:22:24.796 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:26.768 27.676038 84.177025 14603 10 42902 -96
2019-06-05 00:22:27.787 27.676038 84.177025 14603 10 42902 -96
经过一些测试,我来到了这段代码。我尝试通过检查每列窗口内的唯一值(这里窗口大小=3)来检查是否有任何列值发生了变化,然后我总结是否有任何列发生了变化,那么我需要保留它
RadioSmall = RadioMeasAll.loc[:,['measLatitude','measLongitude','measCellId','measNetTypeDetail','measOperatorCode','measCid','measLac','measSignalLevel','cellArfcn']].copy()
def f(x):
y = x[~np.isnan(x)]
if len(np.unique(y)) > 1:
return 1
else:
return 0
a = RadioSmall.rolling(window=3, min_periods=1).apply(f,raw=True)
a['sum']=a.sum(axis=1)
b = pd.DataFrame(index=a.index)
b['filtering'] = a['sum']
df_filtered = b.query('filtering>0')
RadioMeasAll.join(df_filtered)
我觉得很丑。
感谢您的帮助!
【问题讨论】:
-
查看How to make good reproducible pandas examples - 请发布您的实际数据的子集,而不是数据的屏幕截图,以便我们重现您的问题。
-
感谢@w-m 指出这一点。我已经编辑了我的帖子
标签: python pandas dataframe filtering