Python 如何使石斑鱼和轴的长度相同?

Python 如何使石斑鱼和轴的长度相同?,python,csv,matplotlib,pandas,matplotlib-basemap,Python,Csv,Matplotlib,Pandas,Matplotlib Basemap,我的任务是用matplotlib在地图上绘制20次飓风的轨迹。但是,当我运行代码时,我得到一个错误:AssertionError:Grouper和axis必须是相同的长度 以下是我的代码: import numpy as np from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt from PIL import * fig = plt.figure(figsize=(12,12)) ax = fig.

我的任务是用matplotlib在地图上绘制20次飓风的轨迹。但是,当我运行代码时,我得到一个错误:
AssertionError:Grouper和axis必须是相同的长度

以下是我的代码:

import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt 
from PIL import *
fig = plt.figure(figsize=(12,12))

ax = fig.add_axes([0.1,0.1,0.8,0.8])

m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57.,
        projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60.,
        resolution ='l',area_thresh=1000.)

m.bluemarble()
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawstates(linewidth=0.5)

# Creates parallels and meridians

m.drawparallels(np.arange(10.,35.,5.),labels=[1,0,0,1])
m.drawmeridians(np.arange(-120.,-80.,5.),labels=[1,0,0,1])
m.drawmapboundary(fill_color='aqua')

# Opens data file

import pandas as pd
name = [ ]
df = pd.read_csv('louisianastormb.csv')
for name, group in df.groupby([name]):
    latitude = group.lat.values
    longitude = group.lon.values
    x,y = m(longitude, latitude)
    plt.plot(x,y,'y-',linewidth=2 )
    plt.xlabel('Longitude')
    plt.ylabel('Latitude')
    plt.title('20 Hurricanes with Landfall in Louisiana')

plt.savefig('20hurpaths.jpg', dpi=100)
以下是完整的错误输出:

 Traceback (most recent call last): 
File "/home/darealmzd/lstorms.py", line 31, in <module> 
for name, group in df.groupby([name]): 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 186, in groupby 
squeeze=squeeze) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 533, in groupby 
return klass(obj, by, **kwds) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 197, in __init__ 
level=level, sort=sort) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1325, in _get_grouper 
ping = Grouping(group_axis, gpr, name=name, level=level, sort=sort) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1129, in __init__ 
self.grouper = _convert_grouper(index, grouper) 
File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 1350, in _convert_grouper 
raise Assertionerror('Grouper and axis must be same length') 
Assertionerror: Grouper and axis must be same length 
回溯(最近一次呼叫最后一次):
文件“/home/darealmzd/lstorms.py”,第31行,在
对于名称,df.groupby([name])中的组:
文件“/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py”,第186行,在groupby中
挤压=挤压)
groupby中的文件“/usr/local/lib/python2.7/dist packages/pandas/core/groupby.py”,第533行
返回klass(obj,由,**科威特先令)
文件“/usr/local/lib/python2.7/dist packages/pandas/core/groupby.py”,第197行,在
级别=级别,排序=排序)
文件“/usr/local/lib/python2.7/dist packages/pandas/core/groupby.py”,第1325行,在grouper中
ping=分组(组\ U轴,gpr,名称=名称,级别=级别,排序=排序)
文件“/usr/local/lib/python2.7/dist packages/pandas/core/groupby.py”,第1129行,在
self.grouper=\u convert\u grouper(索引,grouper)
文件“/usr/local/lib/python2.7/dist packages/pandas/core/groupby.py”,第1350行,在grouper中
raise Assertionerror('Grouper和axis的长度必须相同')
Assertionerror:Grouper和axis的长度必须相同

问题在于,您正在(有效地)按空列表进行分组(
[[]]
)。因为前面有
name=[]
,然后也将其包装在列表中

如果要在单个列(称为“HurricaneName”)上分组,应执行以下操作:

对于名称,在df.groupby('HurricaneName')中分组:

但是,如果要在多个列上分组,则需要传递一个列表:

对于名称,在df.groupby(['HurricaneName','Year'])中分组。

如果您想将其放入一个变量中,您可以这样做:

col_name = 'State'

for name, group in df.groupby([col_name]):

ValueError:Grouper和axis必须具有相同的长度

如果在
groupby
参数中使用双括号,则可能发生这种情况


(我发布了这篇文章,因为这是谷歌上的最高搜索结果)。

试试iloc,让gropper与axis相等

例如: sns.boxplot(x=df['pH-bined'].iloc[0:3],y=v_计数,data=df)


如果axis=3。

您需要提供更多详细信息。错误发生在哪一行?这是第一次通过for循环吗?什么是完整的错误输出?@tomaugsurger我刚刚添加了完整的错误输出。我在使用group by对经度和纬度值进行分组以绘制风暴路径时遇到问题。看起来
name
是空的,您是有意这样做的吗?可能需要在那里有一个列名。另外,你能把
打印df.head(5)
的结果也添加到那里吗?@Jeffratner好的,谢谢。是否必须在csv文件中指定列名“lat”和/或“lon”?我要做的是将文件中的经度和纬度列放入两个单独的列表中,以便在地图上绘制它们。是否必须在csv文件中指定列名“lat”和/或“lon”?我要做的是将文件中的经度和纬度列放入两个单独的列表中,以便在地图上绘制它们。@mikez1否-这些只是虚拟名称,您只需要使用csv中的任何名称进行分组。重新阅读您的问题-看起来您想分组讨论其他问题(也许您的意思是分组讨论飓风,以便您可以绘制随时间的变化?),如果是这样,那么您想分组讨论类似于
'HurricaneName'
的问题。我将编辑我的答案以反映这一点。如果这回答了您的原始问题(关于错误消息),您可以检查“我的答案”下的箭头,以标记您的问题已解决。我的文件的设置方式是文件开头的年份、名称、纬度、经度及其下的数据。那么df.groupby(['name']):latitude=group.latitude.values group.Longitude.values x,y(latitude,Longitude)中的name,group是否正确?是的,这似乎是正确的,它将生成按“name”(听起来)分组的结果,Ok。非常感谢你的帮助。但是现在我在绘制x,y坐标时出错了。请您帮助
回溯(最近一次调用):文件“/home/darealmzd/lstorms.py”,第42行,x,y(纬度,经度)名称错误:未定义名称“x”
这对我很有帮助,我更新了数据透视表的索引参数,但未能删除方括号
data\u pivot=pd.pivot\u表(input\u data,values='id',#old_index=['level1','level2','level3',index=columns,columns)=['data\u type'],fill\u value=0,aggfunc='count')
其中columns是数据框中的列列表。