小编AJG*_*519的帖子

Pandas Group 多列加权平均

假设我有以下数据框:

>>> 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)

我想知道是否有一种并行的方法可以使用加权平均值来做到这一点。

python pandas

6
推荐指数
1
解决办法
8691
查看次数

在共享索引上加入Pandas Dataframes

我有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)

python dataframe pandas

6
推荐指数
1
解决办法
3320
查看次数

来自Geopandas GeoDataFame的Choropleth地图

我正在尝试从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中的多边形补丁.这似乎涉及更多,但似乎提供了更多的自定义选项.如果有必要沿着这条路线建立一个传奇,我可以跟进另一个问题,到目前为止我将包括我的代码.

谢谢您的帮助.

python matplotlib pandas geopandas

5
推荐指数
1
解决办法
6559
查看次数

熊猫数据框使用索引填充空值

我有一个数据框,其中一栏我想用索引值填充空值。最好的方法是什么?

说我的数据框看起来像这样:

>>> 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)

有什么建议是最好的选择?

python pandas

5
推荐指数
2
解决办法
3008
查看次数

匀称延伸的线条特征

我在 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)

多边形和折线

python shapely

5
推荐指数
1
解决办法
1万
查看次数

在与其他LineString的交点处匀称地拆分LineString

我有一组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)

python shapely geopandas

5
推荐指数
1
解决办法
3695
查看次数

熊猫groupby切片的字符串

我有一个数据框,我想按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)

python dataframe pandas

4
推荐指数
1
解决办法
1099
查看次数

在Pandas数据帧的行中查找第一个真值

我有两个布尔值的数据帧.

第一个看起来像这样:

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)

python pandas

4
推荐指数
1
解决办法
1840
查看次数

使用另一个列表在Python列表中对字符串进

说我有以下列表:

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)

python sorting secondary-sort

3
推荐指数
1
解决办法
174
查看次数

检查组中的值是否在Pandas中相等

我有类似下面的'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)最好的方法来确定组中的所有项目是否相等?

python pandas

3
推荐指数
1
解决办法
3960
查看次数