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筛选dataframe数据:指定字符串数据列的长度超过某一固定阈值的所有数据行
python - Pandas - FillNa 与另一个具有相似列的非空行
python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)
Python pandas - 如果项目在列表中,则为新列的值
Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表使用len计算每个列表的长度