python - pd.DataFrame 正在覆盖列,而不是将数据保存到 pd.DataFrame
问题描述
在这里,我试图创建一个数据框来比较帧之间对象的位置:
Pcount = []
Pcountdb = []
framenumber = 0
frames_count = 0
frames_count = self.vdo.get(cv2.CAP_PROP_FRAME_COUNT)
df = pd.DataFrame(index=range(int(frames_count)))
if len(outputs) > 0:
for i in range(len(outputs):
bbox_xyxy = outputs[:,:4]
identities = outputs[:,-1]
sx = outputs[:,0]
sy = outputs[:,1]
ex = outputs[:,2]
ey = outputs[:,3]
cx = ((sx + ex) /2)
cy = ((sy + ey) /2)
ct = (cx, cy)
cx2 = (cx.tolist())
cy2 = (cy.tolist())
P = identities[i]
df[str(P.astype(int))] = ""
#creates new column with an id number obtained through deepsort
df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]
#the i function from a for loop is necessary for multiple objects in the same frame
print(df)
if not P in Pcountdb:
global PcountT
Pcountdb.append(P)
PcountT = PcountT + 1
framenumber = framenumber + 1
编辑:上面的脚本以占位符开头
df = pd.DataFrame... 为我的视频中的每个图像/帧创建一行
一旦我的对象检测器被 deepsort 循环遍历,就会创建 bbox_xyxy,并且 deepsort 已识别每个检测到的对象并将其识别为具有位置的对象。
然后,我分解 np.arrays 并计算这些对象的中心点,这样它们就可以被视为一个单独的点,而不是一个边界框矩形。
Pandas 接受我的输入并创建一个带有对象 id(在本例中为 1)、中心 xy 坐标的 DataFrame,并将它们放置在与每个帧对应的行中
接下来,我们打印数据框并查看结果
print(df) 返回:
1
Frames
3 [614.5, 632.0]
1
Frames
3
4 [610.5, 624.0]
1
Frames
3
4
5 [603.0, 618.0]
1
Frames
3
4
5
6 [574.0, 615.5]
1
Frames
3
4
5
6
7 [564.0, 610.0]
1
Frames
3
4
5
6
7
8 [559.0, 597.0]
DataFrame 仅跟踪每列最近的一组坐标。如果我要生成两列,则只有每个对象的最后一次出现在我的数据框中(如上图所示,有一个对象,标识为 1)
我需要将输出保存到我的 pd.DataFrame = df,而不是被覆盖。
1
Frames
3 [614.5, 632.0]
4 [610.5, 624.0]
5 [603.0, 618.0]
6 [574.0, 615.5]
7 [564.0, 610.0]
8 [559.0, 597.0]
所以我可以比较这些对象在帧之间的位置,给我一个对象计数,计算对象并将它们存储在 2 个数据库中,“UP”和“DOWN”
解决方案
您的 DataFrame 只是添加最后一个原始数据,因为每次 for 循环运行时,您都会将列重置为空。所以所有以前的值都被删除了。通过查看您的代码,我可以看到,因为您的代码不需要处于 for 循环中。
解决方案:
Pcount = []
Pcountdb = []
framenumber = 0
frames_count = 0
frames_count = self.vdo.get(cv2.CAP_PROP_FRAME_COUNT)
df = pd.DataFrame(index=range(int(frames_count)))
if len(outputs) > 0:
bbox_xyxy = outputs[:,:4]
identities = outputs[:,-1]
sx = outputs[:,0]
sy = outputs[:,1]
ex = outputs[:,2]
ey = outputs[:,3]
cx = ((sx + ex) /2)
cy = ((sy + ey) /2)
ct = (cx, cy)
cx2 = (cx.tolist())
cy2 = (cy.tolist())
P = identities[i]
df[str(P.astype(int))] = ""
for i in range(len(outputs):
df.at[int(framenumber), str(P.astype(int))] = [cx2[i], cy2[i]]
print(df)
希望这有效。
推荐阅读
- python - 迁移错误 = 在应用程序“myapp”中未检测到更改
- asp.net - 在 .NET Core razor 项目中是否有其他方法可以在不使用迁移的情况下连接到 SQL Server?
- python - Azure 机器学习服务上的模型部署错误
- mysql - Mybatis 执行慢
- networking - 计算机网络中的“延迟”和“延迟”有什么区别?
- sql - 如何将计算的 SQL 列转换为小数点后 2 位?
- firebase - Google Cloud Functions 如何检测活动实例的数量?
- python - 如何在 matplotlib 中绘制 200 行(时间序列)并使其在 x 轴上可读?
- python - 如何处理 ParserErrors 并继续解析?
- javascript - 在循环中选择动态元素 id