假设我有以下数据框:
>>> df=pd.DataFrame({'category':['a','a','b','b'],
... 'var1':np.random.randint(0,100,4),
... 'var2':np.random.randint(0,100,4),
... 'weights':np.random.randint(0,10,4)})
>>> df
category var1 var2 weights
0 a 37 36 7
1 a 47 20 1
2 b 33 7 6
3 b 16 6 8
Run Code Online (Sandbox Code Playgroud)
我可以这样计算“var1”的加权平均值:
>>> Grouped=df.groupby('category')
>>> GetWeightAvg=lambda g: np.average(g['var1'], weights=g['weights'])
>>> Grouped.apply(GetWeightAvg)
category
a 38.250000
b 23.285714
dtype: float64
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有一种方法可以编写我的函数并将其应用于我的分组对象,以便我可以在应用它时指定我想要计算的列(或两者)。我希望能够在应用函数时指定,而不是将“var1”写入我的函数中。
就像我可以获得两列的未加权平均值一样:
>>> Grouped[['var1','var2']].mean()
var1 var2
category
a 42.0 28.0
b 24.5 6.5
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种并行的方法可以使用加权平均值来做到这一点。
我有3个DataFrames具有不同数量的共享索引.例如:
>>> df0=pd.DataFrame(index=pd.MultiIndex.from_product([[1,2,3,4],[2011,2012],['A','B']], names=['Season','Year','Location']))
>>> df0['Value0']=np.random.randint(1,100,len(df0))
>>>
>>> df1=pd.DataFrame(index=pd.MultiIndex.from_product([[2011,2012],['A','B']], names=['Year','Location']))
>>> df1['Value1']=np.random.randint(1,100,len(df1))
>>>
>>> df2=pd.DataFrame(index=['A','B'])
>>> df2.index.name='Location'
>>> df2['Value2']=np.random.randint(1,100,len(df2))
>>> df0
Value0
Season Year Location
1 2011 A 18
B 63
2012 A 88
B 30
2 2011 A 35
B 60
2012 A 61
B 4
3 2011 A 70
B 9
2012 A 11
B 38
4 2011 A 68
B 57
2012 A 13
B 35
>>> df1
Value1
Year Location
2011 A 22
B …Run Code Online (Sandbox Code Playgroud) 我正在尝试从Geopandas GeoDataFrame中的多边形制作一个等值线图.我想通过其中一个GeoDataFrame列中的值的分位数来对多边形进行符号化.我正在试图找出不同的选择,看看哪种最适合我的需求.对此有任何建议将不胜感激.
似乎Geopandas确实有能力做到这一点:http://nbviewer.ipython.org/github/geopandas/geopandas/blob/master/examples/choropleths.ipynb
tracts.plot(column='CRIME', scheme='QUANTILES', k=3, colormap='OrRd')
Run Code Online (Sandbox Code Playgroud)
这有效,虽然我找不到太多文档.我希望能够添加一个显示分位数截止值的图例,但看起来Geopandas图表目前仅允许基于分类数据的图例.有没有人为此工作?
另外,我希望能够调整多边形轮廓宽度.这可能吗?
作为另一种选择,我一直在使用matplotlib中的多边形补丁.这似乎涉及更多,但似乎提供了更多的自定义选项.如果有必要沿着这条路线建立一个传奇,我可以跟进另一个问题,到目前为止我将包括我的代码.
谢谢您的帮助.
我有一个数据框,其中一栏我想用索引值填充空值。最好的方法是什么?
说我的数据框看起来像这样:
>>> import numpy as np
>>> import pandas as pd
>>> d=pd.DataFrame(index=['A','B','C'], columns=['Num','Name'], data=[[1,'Andrew'], [2, np.nan], [3, 'Chris']])
>>> print d
Num Name
A 1 Andrew
B 2 NaN
C 3 Chris
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码行来获取所需的内容:
d['Name'][d['Name'].isnull()]=d.index
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下警告:“试图在DataFrame的切片副本上设置一个值”
我想最好使用fillna或loc来做到这一点,但我不知道如何使用两者来做到这一点。我尝试了以下方法:
>>> d['Name']=d['Name'].fillna(d.index)
>>> d.loc[d['Name'].isnull()]=d.index
Run Code Online (Sandbox Code Playgroud)
有什么建议是最好的选择?
我在 Shapely 中有一个 Polygon 和一个 MultiLineString。我想扩展未到达多边形边界的 LineString 段,以便它确实到达多边形边界。如果它延伸过去也没关系,因为之后我可以轻松地将它夹到边界上。
理想情况下,它会以相同的角度继续,但我想这比直接将其延伸到边界要困难得多。
有人对我如何做到这一点有任何建议吗?
我使用以下代码生成了几何图形(作为我实际需要执行的操作的简化示例):
import shapely
from shapely.geometry import *
Line=MultiLineString([((3,0),(3,5)),((3,5),(7,9.5))])
Box=Polygon([(0,0),(0,10),(10,10),(10,0)])
Run Code Online (Sandbox Code Playgroud)
我有一组LineString,这些LineString与其他LineString相交,并且我想在这些交点将LineString分成单独的段。我有一个解决方案,但我认为这不是最好的方法。
假设我们正在处理一个LineString:
>>> import shapely
>>> from shapely.geometry import *
>>> import geopandas as gpd
>>>
>>> MyLine=LineString([(0,0),(5,0),(10,3)])
>>> MyLine
<shapely.geometry.linestring.LineString object at 0x1277EEB0>
>>>
Run Code Online (Sandbox Code Playgroud)
与该LineString相交的2行:
>>> IntersectionLines=gpd.GeoSeries([LineString([(2,1.5),(3,-.5)]), LineString([(5,.5),(7,.5)])])
>>> IntersectionLines
0 LINESTRING (2 1.5, 3 -0.5)
1 LINESTRING (5 0.5, 7 0.5)
dtype: object
>>>
Run Code Online (Sandbox Code Playgroud)
我可以得到交点如下:
>>> IntPoints=MyLine.intersection(IntersectionLines.unary_union)
>>> IntPointCoords=[x.coords[:][0] for x in IntPoints]
>>> IntPointCoords
[(2.75, 0.0), (5.833333333333333, 0.5)]
>>>
Run Code Online (Sandbox Code Playgroud)
然后,我提取起点和终点,并用这些点和相交点创建对,这些对点将用于形成线段:
>>> StartPoint=MyLine.coords[0]
>>> EndPoint=MyLine.coords[-1]
>>> SplitCoords=[StartPoint]+IntPointCoords+[EndPoint]
>>>
>>> def pair(list):
... for i in range(1, len(list)): …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,我想按ID字段的第一部分进行分组。例如,说我有以下内容:
>>> import pandas as pd
>>> df=pd.DataFrame(data=[['AA',1],['AB',4],['AC',5],['BA',11],['BB',2],['CA',9]], columns=['ID','Value'])
>>> df
ID Value
0 AA 1
1 AB 4
2 AC 5
3 BA 11
4 BB 2
5 CA 9
>>>
Run Code Online (Sandbox Code Playgroud)
如何按ID字段的首字母分组?
我目前可以通过创建一个新列然后对其进行分组来做到这一点,但是我想有一种更有效的方法:
>>> df['GID']=df['ID'].str[:1]
>>> df.groupby('GID')['Value'].sum()
GID
A 10
B 13
C 9
Name: Value, dtype: int64
>>>
Run Code Online (Sandbox Code Playgroud) 我有两个布尔值的数据帧.
第一个看起来像这样:
b1=pd.DataFrame([[ True, False, False, False, False],
[False, False, True, False, False],
[False, True, False, False, False],
[False, False, False, False, False]])
b1
Out[88]:
0 1 2 3 4
0 True False False False False
1 False False True False False
2 False True False False False
3 False False False False False
Run Code Online (Sandbox Code Playgroud)
如果我只对每行是否有任何True值感兴趣,我可以使用该any方法:
b1.any(1)
Out[89]:
0 True
1 True
2 True
3 False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
但是,我希望基于第二个数据框添加一个约束,如下所示:
b2 = pd.DataFrame([[ True, False, True, False, False],
[False, False, …Run Code Online (Sandbox Code Playgroud) 说我有以下列表:
List1=['Name1','Name3','Color1','Size2','Color3','Color2','Name2','Size1', 'ID']
List2=['ID','Color1','Color2','Size1','Size2','Name1','Name2']
Run Code Online (Sandbox Code Playgroud)
每个列表将具有名为"ID"变量的元素,然后是3个其他类别(名称,颜色和大小),其中每个类别中具有未确定数量的元素.
我想对这些变量进行排序,而不知道每个类别中将包含以下"排序列表"的数量:
SortList=['ID','Name','Size','Color']
Run Code Online (Sandbox Code Playgroud)
我可以得到所需的输出(见下文),虽然我想有更好/更pythonic的方式这样做.
>>> def SortMyList(MyList,SortList):
... SortedList=[]
... for SortItem in SortList:
... SortItemList=[]
... for Item in MyList:
... ItemWithoutNum="".join([char for char in Item if char.isalpha()])
... if SortItem==ItemWithoutNum:
... SortItemList.append(Item)
... if len(SortItemList)>1:
... SortItemList=[SortItem+str(I) for I in range(1,len(SortItemList)+1)]
... for SortedItem in SortItemList:
... SortedList.append(SortedItem)
... return SortedList
...
>>>
>>> SortMyList(List1, SortList)
['ID', 'Name1', 'Name2', 'Name3', 'Size1', 'Size2', 'Color1', 'Color2', 'Color3']
>>> SortMyList(List2, SortList)
['ID', 'Name1', 'Name2', 'Size1', 'Size2', 'Color1', …Run Code Online (Sandbox Code Playgroud) 我有类似下面的'DataFrame`:
>>> df=pd.DataFrame(index=['A','A','A','B','B','C','C','C'])
>>> df['Value1']=[1,1,1,2,1,4,4,4]
>>> df['Value2']=[1,2,3,4,5,6,7,8]
>>> df
Value1 Value2
A 1 1
A 1 2
A 1 3
B 2 4
B 1 5
C 4 6
C 4 7
C 4 8
>>>
Run Code Online (Sandbox Code Playgroud)
该索引DataFrame代表3个不同的组.我想检查组中的列值是否都相等.我目前的方法和所需的输出如下:
>>> result_list=[]
>>> for Col in df.columns:
... result=df.groupby(level=0)[Col].apply(lambda x: len(set(x))==1)
... result_list.append(result)
...
>>>
>>> final=pd.concat(result_list,1)
>>> final
Value1 Value2
A True False
B False False
C True False
>>>
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?我想知道是否可以这样做而不必循环遍历我的列DataFrame.
另外是使用len(set(x)==1)最好的方法来确定组中的所有项目是否相等?