小编sat*_*ato的帖子

将每一行除以前一行

我有熊猫数据框:

df = pd.DataFrame()
df['city'] = ['NY','NY','LA','LA']
df['hour'] = ['0','12','0','12']
df['value'] = [12,24,3,9]

   city hour value
0   NY  0   12
1   NY  12  24
2   LA  0   3
3   LA  12  9
Run Code Online (Sandbox Code Playgroud)

我想,对于每个城市,将每一行除以前一行并将结果写入一个新的数据帧。所需的输出是:

city ratio
NY   2
LA   3
Run Code Online (Sandbox Code Playgroud)

什么是最pythonic的方式来做到这一点?

python dataframe pandas

8
推荐指数
2
解决办法
7395
查看次数

Puply icreate_animations在Jupyter Notebook上脱机

我试图在Jupyter Notebook上复制这个绘图教程,其数据集与示例中给出的数据集相匹配,我只需要更改一列的名称.这里的问题是离线命令

py.icreate_animations(figure)
Run Code Online (Sandbox Code Playgroud)

在离线笔记本模式下成为

icreate_animations(figure)
Run Code Online (Sandbox Code Playgroud)

不被承认.此外,如果我只是尝试用于静态图的iplot(figure)命令,则会引发一个很长的错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-b81a66612f63> in <module>()
     38 figure['layout']['sliders'] = [sliders_dict]
     39 
---> 40 iplot(figure)

//anaconda/lib/python2.7/site-packages/plotly/offline/offline.pyc in iplot(figure_or_data, show_link, link_text, validate, image, filename, image_width, image_height, config)
    330     config.setdefault('linkText', link_text)
    331 
--> 332     figure = tools.return_figure_from_figure_or_data(figure_or_data, validate)
    333 
    334     # Though it can add quite a bit to the display-bundle size, we include

//anaconda/lib/python2.7/site-packages/plotly/tools.pyc in return_figure_from_figure_or_data(figure_or_data, validate_figure)
   1383 
   1384         try:
-> 1385             graph_objs.Figure(figure)
   1386         except exceptions.PlotlyError as err:
   1387             raise …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 plotly jupyter-notebook

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

旋转整数数据框时的浮点值(pandas - python)

我有一个巨大的熊猫数据框,形状像这个例子:

 new_id hour names values
    0   0   mark    5
    0   0   matt    4
    0   0   alex    3
    1   0   roger   2
    1   0   arthur  7
    1   1   alf     8
    2   1   ale     6
    3   1   peter   5
    3   2   tom     2
    4   2   andrew  7
Run Code Online (Sandbox Code Playgroud)

我需要重塑它,所以我使用pivot_table()

dummy=dummy.pivot_table(index=['hour','new_id'],columns='name', values='values').fillna(0)
Run Code Online (Sandbox Code Playgroud)

所以它变成

        names   ale alex alf andrew arthur mark matt peter roger tom
hour    new_id                                      
0           0   0.0 3.0 0.0 0.0 0.0 5.0 4.0 0.0 0.0 0.0
            1   0.0 0.0 0.0 …
Run Code Online (Sandbox Code Playgroud)

python pivot-table sum pandas

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

在 networkit (python) 中使用 forEdges 迭代器

我仔细阅读了文档,但我仍然不清楚如何使用 G.forEdges(),它被描述为“实验边缘迭代器接口”。

假设我想降低图形的密度。我有一个排序的权重列表,我想根据它们的权重删除边,直到图分成两个连接的组件。然后我将选择保持图形连接的最少链接数。我会做这样的事情:

cc = components.ConnectedComponents(G).run()
while cc.numberOfComponents()==1:
    for weight in weightlist:
        for (u,v) in G.edges():
            if G.weight(u,v)==weight:
                G=G.removeEdge(u,v)
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我从文档中知道有这个边缘迭代器,它可能以更有效的方式进行迭代。但是从文档中我真的无法理解如何正确使用 this forEdges,并且我无法在互联网上找到一个示例。有任何想法吗?

或者也许是做我想做的事情的另一种想法:因为它是一个巨大的图(1.25 亿个链接),即使我在一个集群上工作,迭代也将永远持续下去。

python graph network-analysis networkit

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

将标准偏差添加到熊猫 groupby 对象的平均值

我有一个熊猫数据框,如下所示:

import pandas as pd
df=pd.DataFrame(data=np.random.rand(10,5),columns=['blue','white','red','green','purple'])
df['group_labels']=['a','a','b','c','b','c','a','c','b','b']
Run Code Online (Sandbox Code Playgroud)

我想按“group_labels”分组,计算平均值,然后显示在新的数据框中(平均值 +- 平均值的标准偏差)。所以基本上我想要:

mean_df=df.groupby('group_labels').mean().reset_index()
Run Code Online (Sandbox Code Playgroud)

但是,在每个单元格中,我还需要显示

+- std deviation of the group / sqrt(size of the group)
Run Code Online (Sandbox Code Playgroud)

那可能吗?

python pandas pandas-groupby

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

更改 geopandas choropleth 地图图例的条目顺序

我正在城市地图上绘制某个分类值。我用来绘制的代码行如下:

fig = plt.figure(figsize=(12, 12))
ax = plt.gca()
urban_data.plot(column="category", cmap="viridis", ax=ax, categorical=True, /
                k=4, legend=True, linewidth=0.5, /
                legend_kwds={'fontsize':'19', 'loc':'lower left'}) 
Run Code Online (Sandbox Code Playgroud)

其中城市数据是 geopandas 数据框,我使用 matplotlib 作为绘图库。该参数legend_kwds允许我控制图例上的次要事物,例如位置或字体大小,但我无法决定主要事物,例如图例框中条目的顺序。事实上,我的类别是按 1-2-3-4 排列的,但我总是以不同的顺序显示它们。

是否可以对图例有更多的控制权?例如在函数外部gdf.plot()调用它?而且,如果是这样,我如何将图例中的颜色与地图中的颜色相匹配,这些颜色是 viridis 颜色图的离散值(我不确切知道)?


编辑:这是一个可验证的示例。不幸的是,shapefiles需要其他文件才能工作,这里geometry需要一个(区域,而不是点)列,所以我不得不要求你下载这个美国的shpfile 。您需要的一切都在这个文件夹中。这是重现该问题的代码。输出中的绘图很糟糕,因为我不关心这里的坐标系,但重要的是图例。

import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt 

gdf=gpd.read_file('.../USA_adm1.shp')
clusters=np.random.randint(0,4, size=52)
gdf['cluster']=clusters
clusdict={1: 'lower-middle', 2: 'upper-middle', 3: 'upper', 0: 'lower'}
gdf['cluster']=gdf['cluster'].map(clusdict)

fig = plt.figure(figsize=(12, 12))
ax = plt.gca()
gdf.plot(column='cluster',cmap='viridis', categorical=True, legend=True, ax=ax)
Run Code Online (Sandbox Code Playgroud)

python matplotlib legend geopandas choropleth

2
推荐指数
1
解决办法
3045
查看次数

在 Networkit 中检索原始节点名称

我不确定我是否理解 Networkit 如何处理节点的名称。

\n\n

假设我使用另一个 Python 模块(如 Networkx)从边缘列表中读取一个大图;然后我将其转换为网络图并执行一些操作,例如计算成对距离。执行此操作的一段简单代码可以是:

\n\n
import networkx as nx\nimport networkit as nk\n\nnxG=nx.read_edgelist('test.edgelist',data=True)\n\nG = nk.nxadapter.nx2nk(nxG, weightAttr='weight')\n\napsp = nk.distance.APSP(G)\napsp.run()\ndist=apsp.getDistances()\n
Run Code Online (Sandbox Code Playgroud)\n\n

十分简单。

\n\n

现在,如果我想对这些距离做一些事情该怎么办?例如,如果我想根据(我不知道\xe2\x80\x99)路径上的权重或任何其他需要检索原始节点 ID 的度量来绘制它们,该怎么办?

\n\n

getDistances()函数返回一个列表列表,每个节点都有一个列表,其中包含到每个其他节点的距离,但我不知道 Networkit 如何将节点 \xe2\x80\x99 名称映射到它用作节点标识符的整数序列,因此计算距离并将其存储在输出中所遵循的顺序。

\n

python networkx networkit

2
推荐指数
1
解决办法
948
查看次数

使用Python处理来自csv文件的数据

我知道Python几乎是出于这些目的而制作的,但我真的很难理解我如何访问数据集中的特定值,并且我尝试使用pandas和csv模块.这可能是语法问题.事情就是这样:我有一个csv文件的形式

Nation, Year, No. of refugees
Afghanistan,2013,6657
Albania,2013,199
Algeria,2013,91
Angola,2013,47
Armenia,2013,156
...
...
Afghanistan,2012,6960
Albania,2012,157
Algeria,2012,67
Angola,2012,43
Armenia,2012,143
...
Run Code Online (Sandbox Code Playgroud)

等等.我想做的是每年获得难民总数,即选择某一年的所有行,并总结相关"难民难民"专栏中的所有要素.我成功地做到了这一点:

import csv

with open('refugees.csv', 'r') as f:
    d_reader = csv.DictReader(f)
    headers = d_reader.fieldnames
    print headers

    #2013
    list2013=[]
    for line in d_reader:
        if (line['Year']=='2013'):
            list2013.append(line['Refugees'])
    list2013=map(int,list2013) #I have str values in my file
    ref13=sum(list2013)
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一个更优雅(最重要的是,迭代)的解决方案.此外,如果我在不同年份多次执行该程序,我总是得到0:它仅适用于2013年,不确定原因.

编辑:我也试过这个,没有成功,但我认为这可能是完全错误的:

import csv
refugees_dict={}
a=range(2005,2014)
a=map(str, a)
with open('refugees.csv', 'r') as f:
    d_reader = csv.DictReader(f)

    for element in a:
        for line in d_reader:
            if (line['Year']==element):
                print …
Run Code Online (Sandbox Code Playgroud)

python csv pandas

0
推荐指数
1
解决办法
81
查看次数