Python 中的 Pandas 错误:列的长度必须与键的长度相同

Posted

技术标签:

【中文标题】Python 中的 Pandas 错误:列的长度必须与键的长度相同【英文标题】:Pandas error in Python: columns must be same length as key 【发布时间】:2018-03-17 01:08:12 【问题描述】:

我正在从几个网站抓取一些数据,并使用 pandas 对其进行修改。

在前几块数据上它运行良好,但后来我收到以下错误消息:

Traceback(most recent call last):
  File "data.py", line 394 in <module> df2[['STATUS_ID_1','STATUS_ID_2']] = df2['STATUS'].str.split(n=1, expand=True)
  File "/home/web/.local/lib/python2.7/site-packages/pandas/core/frame.py, line 2326, in __setitem__ self._setitem_array(key,value)
  File "/home/web/.local/lib/python2.7/site-packages/pandas/core/frame.py, line 2350, in _setitem_array
raise ValueError("Columns must be same length as key')  ValueError: Columns must be same length as key

我的代码在这里:

df2 = pd.DataFrame(datatable,columns = cols)
df2['FLIGHT_ID_1'] = df2['FLIGHT'].str[:3]
df2['FLIGHT_ID_2'] = df2['FLIGHT'].str[3:].str.zfill(4)
df2[['STATUS_ID_1','STATUS_ID_2']] = df2['STATUS'].str.split(n=1, expand=True)

EDIT-jezrael :我使用了您的代码,并从中打印: 我希望通过这个我们可以找到问题所在..因为当脚本遇到此拆分问题时似乎是随机的..

                 0         1
2       Landed   8:33 AM
3       Landed   9:37 AM
4       Landed   9:10 AM
5       Landed   9:57 AM
6       Landed   9:36 AM
8       Landed   8:51 AM
9       Landed   9:18 AM
11      Landed   8:53 AM
12      Landed   7:59 AM
13      Landed   7:52 AM
14      Landed   8:56 AM
15      Landed   8:09 AM
18      Landed   8:42 AM
19      Landed   9:39 AM
20      Landed   9:45 AM
21      Landed   7:44 AM
23      Landed   8:36 AM
27      Landed   9:53 AM
29      Landed   9:26 AM
30      Landed   8:23 AM
35      Landed   9:59 AM
36      Landed   8:38 AM
37      Landed   9:38 AM
38      Landed   9:37 AM
40      Landed   9:27 AM
43      Landed   9:14 AM
44      Landed   9:22 AM
45      Landed   8:18 AM
46      Landed  10:01 AM
47      Landed  10:21 AM
..         ...       ...
316    Delayed   5:00 PM
317    Delayed   4:34 PM
319  Estimated   2:58 PM
320  Estimated   3:02 PM
321    Delayed   4:47 PM
323  Estimated   3:08 PM
325    Delayed   3:52 PM
326  Estimated   3:09 PM
327  Estimated   2:37 PM
328  Estimated   3:17 PM
329  Estimated   3:20 PM
330  Estimated   2:39 PM
331    Delayed   4:04 PM
332    Delayed   4:36 PM
337  Estimated   3:47 PM
339  Estimated   3:37 PM
341    Delayed   4:32 PM
345  Estimated   3:34 PM
349  Estimated   3:24 PM
356    Delayed   4:56 PM
358  Estimated   3:45 PM
367  Estimated   4:09 PM
370  Estimated   4:04 PM
371  Estimated   4:11 PM
373    Delayed   5:21 PM
382  Estimated   3:56 PM
384    Delayed   4:28 PM
389    Delayed   4:41 PM
393  Estimated   4:02 PM
397    Delayed   5:23 PM

[240 rows x 2 columns]

【问题讨论】:

你能添加一些数据样本吗? (***.com/questions/46522269/…) (***.com/questions/46524461/…) 嗯,真的很有趣。你能检查df3 = df2['STATUS'].str.split(n=1, expand=True) 然后print (df3[df3[df3.columns[-1]].notnull()]) 吗?您可以在问题中添加输出吗? 很有趣!!因为我重新启动了我的脚本,它仍在运行..所以我不知道为什么我收到此错误消息,如果现在它运行完美o.O 我想我明白了你的问题。给我一些时间,想想解决办法。 【参考方案1】:

您需要稍微修改一下解决方案,因为有时它返回 2 有时只返回一列:

df2 = pd.DataFrame('STATUS':['Estimated 3:17 PM','Delayed 3:00 PM'])


df3 = df2['STATUS'].str.split(n=1, expand=True)
df3.columns = ['STATUS_ID'.format(x+1) for x in df3.columns]
print (df3)
  STATUS_ID1 STATUS_ID2
0  Estimated    3:17 PM
1    Delayed    3:00 PM

df2 = df2.join(df3)
print (df2)
              STATUS STATUS_ID1 STATUS_ID2
0  Estimated 3:17 PM  Estimated    3:17 PM
1    Delayed 3:00 PM    Delayed    3:00 PM

另一个可能的数据 - 所有数据都没有空格,解决方案也可以:

df2 = pd.DataFrame('STATUS':['Canceled','Canceled'])

和解决方案返回:

print (df2)
     STATUS STATUS_ID1
0  Canceled   Canceled
1  Canceled   Canceled

大家一起:

df3 = df2['STATUS'].str.split(n=1, expand=True)
df3.columns = ['STATUS_ID'.format(x+1) for x in df3.columns]
df2 = df2.join(df3)

【讨论】:

我必须在我的代码中正确插入什么?这个:df2[['STATUS_ID_1','STATUS_ID_2']] = df2['STATUS'].str.split(n=1, expand=True) df2 = pd.DataFrame('STATUS') df3 = df2 ['STATUS'].str.split(n=1, expand=True) df3.columns = ['STATUS_ID'.format(x+1) for x in df3.columns] ? 我的代码是df2[['STATUS_ID_1','STATUS_ID_2']] = df2['STATUS'].str.split(n=1, expand=True) 好吧,我要写什么来代替这个 ['Canceled','Canceled']?只删除它并使用你的前 3 行? 不,它只是作为解决方案工作的演示......你忽略它;) 这并不容易,但我认为它应该工作得很好;)向匈牙利问好;)

以上是关于Python 中的 Pandas 错误:列的长度必须与键的长度相同的主要内容,如果未能解决你的问题,请参考以下文章

Pandas/Python 检查中间值和另一列的输出值

pandas筛选dataframe数据:指定字符串数据列的长度超过某一固定阈值的所有数据行

python - Pandas - FillNa 与另一个具有相似列的非空行

python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)

Python pandas - 如果项目在列表中,则为新列的值

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表使用len计算每个列表的长度