为什么不加第一个循环就能运行,加上就运行不了
import pandas as pd
from pathlib import *
dfz = pd.DataFrame(columns=['id', 'time1', 'lng1', 'lat1', 'time2', 'lng2', 'lat2'])
path = '/Users/xing/邢惠尧/课/交通数据分析与建模/Taxi_new/'
p = Path(path)
for w in p.iterdir():
df = pd.read_csv(w, encoding='utf-8')
# 制作轨迹段表格,每一行代表一个轨迹段
df1 = df.shift(-1)
df1.drop(columns=['id'], inplace=True)
df = pd.concat([df, df1], axis=1)
df.columns = ['id', 'time1', 'lng1', 'lat1', 'OpenStatus1', 'time2', 'lng2', 'lat2', 'OpenStatus2']
df.drop(df.shape[0] - 1, inplace=True)
# 提取上下车信息,OpenStatus1=0,OpenStatus2=1代表上车;OpenStatus1=1,OpenStatus2=0代表下车
for i in range(len(df)):
if df.loc[i, 'OpenStatus1'] == df.loc[i, 'OpenStatus2']:
df.drop(i, inplace=True)
# 重置索引
df.reset_index(drop=True, inplace=True)
# 将第一条为下车信息的删除,使表格的第一条信息为上车
if df.loc[0, 'OpenStatus1'] == 1 and df.loc[0, 'OpenStatus2'] == 0:
df.drop(0, inplace=True)
# 重置索引
df.reset_index(drop=True, inplace=True)
# 制作OD表,每一行代表一次出行信息,左边为上车信息,右边为下车信息
df.drop(columns=['time2', 'lng2', 'lat2', 'OpenStatus2'], inplace=True)
df.columns = ['id', 'time', 'lng', 'lat', 'OpenStatus']
df1 = df.shift(-1)
df1.drop(columns=['id'], inplace=True)
df = pd.concat([df, df1], axis=1)
df.columns = ['id', 'time1', 'lng1', 'lat1', 'OpenStatus1', 'time2', 'lng2', 'lat2', 'OpenStatus2']
df.drop(df.shape[0] - 1, inplace=True)
for i in range(1, len(df), 2):
df.drop(i, inplace=True)
df.drop(columns=['OpenStatus1', 'OpenStatus2'], inplace=True)
# 重置索引
df.reset_index(drop=True, inplace=True)
# 将所有车的OD合并
dfz = pd.concat([dfz, df])
dfz.to_csv('OD.cvs', encoding='utf-8', index=False)
有错,冲突
您似乎正试图从给定目录中的多个 CSV 文件中提取和合并有关轨道段和行程的信息,然后将结果数据写入新的 CSV 文件。
代码中的第一个循环遍历给定目录中的所有文件,并将每个文件读入一个名为df. 然后它执行一些数据处理df以提取轨道段和行程,然后将结果数据附加到名为dfz.
您遇到的问题可能是由于您inplace在多个数据框操作操作中使用了该参数。该inplace参数允许您就地修改数据框,而无需创建新的数据框。这在某些情况下很有用,但如果不小心,也可能导致意外行为。
特别是,数据框的drop方法返回一个新的数据框,其中删除了指定的行或列,除非inplace参数设置为True. 如果您使用inplace=True,原始数据框将被修改并且该drop方法将返回None。
例如,在这行代码中:
df. drop(columns=['id'], inplace=True)
将df修改数据框以删除“id”列,该drop方法将返回None。如果您随后尝试df使用 与另一个数据框连接pd.concat,您可能会遇到错误,因为df它None不是数据框。
要解决此问题,您应该inplace=False在调用drop方法时进行设置,或者将方法的结果分配给drop新变量:
df = df.drop(columns=['id'], inplace=False)
要么
df = df.drop(columns=['id'])