错误:列的长度必须与键的长度相同,原因很明显

2024-09-25 08:40:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个测试数据帧,由具有以下属性的数据的缩减样本大小组成:

dataframe = pd.read_csv('Data/bookstore_0.txt', sep= ' ', header=None)
dataframe.columns = ['Timestamp', 'ID', 'X', 'Y']
dataframe.insert(4, 'X_Diff', None)
dataframe.insert(5, 'Y_Diff', None)
#dataframe[['X_Diff', 'Y_Diff']] = dataframe.groupby('ID')[['X', 'Y']].diff()
dataframe.fillna(0, inplace=True)
dataframe.describe()

             Timestamp  ID               X  Y                           X_Diff      Y_Diff
count   16100.000000    16100.000000    16100.000000    16100.000000    16100.0     16100.0
mean    6583.729193     404.000000         -2.506816        8.656825    0.0         0.0
std     3546.059991     232.390521         12.020219       10.789998    0.0         0.0
min     0.000000        2.000000          -26.970000      -20.233000    0.0         0.0
25%     3720.000000     203.000000        -12.593000        1.958000    0.0         0.0
50%     6840.000000     404.000000         -4.645000       14.339000    0.0         0.0
75%     9360.000000     605.000000          7.870000       17.123000    0.0         0.0
max     13332.000000    806.000000         26.951000       20.521000    0.0         0.0

应用注释掉的方法dataframe[['X_Diff', 'Y_Diff']] = dataframe.groupby('ID')[['X', 'Y']].diff()会产生以下结果:

           Timestamp              ID               X                Y         X_Diff          Y_Diff
count   16100.000000    16100.000000    16100.000000    16100.000000    16100.000000    16100.000000
mean    6583.729193     404.000000         -2.506816    8.656825        0.039345        -0.004718
std     3546.059991     232.390521         12.020219    10.789998       0.274080         0.183496
min     0.000000        2.000000          -26.970000   -20.233000      -0.922000        -1.133000
25%     3720.000000     203.000000        -12.593000     1.958000       0.000000        -0.007000
50%     6840.000000     404.000000         -4.645000    14.339000       0.000000         0.000000
75%     9360.000000     605.000000          7.870000    17.123000       0.077000         0.000000
max     13332.000000    806.000000         26.951000    20.521000       1.823000         0.883000

使用我的完整数据集,我得到以下结果:

txtfiles = glob.glob('Data/*.txt')
frames = [pd.read_csv(file, sep= ' ', header=None) for file in txtfiles]
ped_data = pd.concat(frames)
ped_data.columns = ['Timestamp', 'ID', 'X', 'Y']
ped_data.insert(4, 'X_Diff', None)
ped_data.insert(5, 'Y_Diff', None)
#ped_data[['X_Diff', 'Y_Diff']] = ped_data.groupby('ID')[['X', 'Y']].diff()
ped_data.fillna(0, inplace=True)

ped_data.describe()

            Timestamp              ID               X               Y     X_Diff      Y_Diff
count   108120.000000   108120.000000   108120.000000   108120.000000   108120.0    108120.0
mean      5949.556049      325.945986       -1.028735       10.648398        0.0         0.0
std       3713.754148      250.269185       14.773480       17.339787        0.0         0.0
min          0.000000        0.000000      -37.029000      -28.242000        0.0         0.0
25%       2676.000000      123.000000      -12.456000       -4.186000        0.0         0.0
50%       5772.000000      276.000000       -1.909000       12.858000        0.0         0.0
75%       9036.000000      479.000000       10.421000       20.983000        0.0         0.0
max      14532.000000    1141.000000        36.632000       63.559000        0.0         0.0

但是,再次应用注释掉的方法会导致以下错误:

ped_data[['X_Diff', 'Y_Diff']] = ped_data.groupby('ID')[['X', 'Y']].diff()
ValueError: Columns must be same length as key

我曾尝试在这里研究其他来源,但还没有真正找到解决方案

该方法本身计算得很好,就像简单地运行一样

ped_data.groupby('ID')[['X', 'Y']].diff()

但是,将用正确的值覆盖X、Y列,这意味着必须在

ped_data[['X_Diff', 'Y_Diff']] =

分配零件

我将感谢任何帮助

编辑:我发现了一个解决方法,以防任何有类似问题的人偶然发现:

通过在每个帧上运行dataframe操作,并在完成后将它们组合在一起,我能够避免错误

pedestrian_data = pd.DataFrame()
txtfiles = glob.glob('Data/*.txt')

for file in txtfiles:
    dataframe = pd.read_csv(file, sep= ' ', header=None)
    dataframe.columns = ['Timestamp', 'ID', 'X', 'Y']
    dataframe.insert(4, 'X_Diff', None)
    dataframe.insert(5, 'Y_Diff', None)
    dataframe[['X_Diff', 'Y_Diff']] = dataframe.groupby('ID')[['X', 'Y']].diff()
    dataframe.fillna(0, inplace=True)
    pedestrian_data = pedestrian_data.append(dataframe)

它很可能在性能方面更慢,因为它使用了一个常规的Python for循环,而不是让panda来完成繁重的工作,但至少它可以运行

我仍然会等待,看看是否有人有一个答案,尽管这是值得张贴


Tags: 方法noneiddataframedatadifftimestampglob
1条回答
网友
1楼 · 发布于 2024-09-25 08:40:17

请尝试改用groupby.transform

ped_data[['X_Diff', 'Y_Diff']] = ped_data.groupby('ID')[['X', 'Y']].transform('diff')

相关问题 更多 >