小编BER*_*ERA的帖子

pandas multiindex - 如何在使用列时选择第二级?

愚蠢的问题,但我真的找不到答案.我有一个包含此索引的数据框:

index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
Run Code Online (Sandbox Code Playgroud)

这是一个有用的结构df['stock1'],但我如何选择所有价格数据?我无法理解文档.

我试过以下没有运气: df[:,'price'] df[:]['price'] df.loc(axis=1)[:,'close'] df['price]

如果无论出于何种原因,这种索引风格一般都被认为是一个坏主意,那么什么是更好的选择呢?我应该将股票的多指数指数作为时间序列上的标签而不是列级别吗?

非常感谢

编辑 - 我使用multiindex作为列,而不是索引(措辞对我来说更好).文档中的示例侧重于多级索引而不是列结构.

python-3.x pandas

30
推荐指数
4
解决办法
2万
查看次数

按年份选择行

我想按一年选择行:

import pandas as pd
import numpy as np

df = pd.DataFrame(columns=['Start','End'],data=[[np.datetime64('2001-01-01'),np.datetime64('2001-07-01')],[np.datetime64('2002-01-01'),np.datetime64('2002-11-01')]])
print(df)

       Start        End
0 2001-01-01 2001-07-01
1 2002-01-01 2002-11-01
Run Code Online (Sandbox Code Playgroud)

所以我尝试:

df_2001 = df.loc[df['Start'.year == 2001)]]
Traceback (most recent call last):
  Python Shell, prompt 16, line 1
invalid syntax: <string>, line 1, pos 30
Run Code Online (Sandbox Code Playgroud)

如何在 datetime64 列中按年份进行选择?

python pandas

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

在有向图中查找结束节点

我有很多像这样的子图:

import networkx as nx
G = nx.DiGraph()
G.add_edges_from([(2,1),(3,1),(1,4)])
nx.draw(G)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想找到所有的起始节点和结束节点。所以我用:

startnodes = [x for x in G.nodes() if G.out_degree(x)==1 and G.in_degree(x)==0]
endnode = [x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1][0]
print(startnodes, endnode)
[2, 3] 4
Run Code Online (Sandbox Code Playgroud)

但有些子图如下所示,末端节点的度数为 2。我怎样才能找到它的结束节点?

G.add_edges_from([(2,1),(3,1)]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

python networkx

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

分组和加权平均

我有一个数据框:

import pandas as pd
import numpy as np

df=pd.DataFrame.from_items([('STAND_ID',[1,1,2,3,3,3]),('Species',['Conifer','Broadleaves','Conifer','Broadleaves','Conifer','Conifer']),
                             ('Height',[20,19,13,24,25,18]),('Stems',[1500,2000,1000,1200,1700,1000]),('Volume',[200,100,300,50,100,10])])

   STAND_ID      Species  Height  Stems  Volume
0         1      Conifer      20   1500     200
1         1  Broadleaves      19   2000     100
2         2      Conifer      13   1000     300
3         3  Broadleaves      24   1200      50
4         3      Conifer      25   1700     100
5         3      Conifer      18   1000      10
Run Code Online (Sandbox Code Playgroud)

我想按 STAND_ID 和 Species 分组,对 Height 和 Stems 应用加权平均值,以体积为重量并拆开。

所以我尝试:

newdf=df.groupby(['STAND_ID','Species']).agg({'Height':lambda x: np.average(x['Height'],weights=x['Volume']),
                                              'Stems':lambda x: np.average(x['Stems'],weights=x['Volume'])}).unstack()
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

内置键错误:'高度'

我怎样才能解决这个问题?

python pandas

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

在 datetime 对象中添加或更改时间

我有多个日期时间对象,例如:

>>a
datetime.datetime(2009, 11, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)

我想保持日期不变并将时间更改为零(时间上的三位数字):

>>b
datetime.datetime(2009, 11, 1, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

可能很简单,但我想不通

编辑: 出于某种原因,秒为零不起作用。没关系,它适用于 1:

>>a
datetime.datetime(2009, 11, 1, 0, 0)
>>b = datetime.datetime.combine(a.date(), datetime.time(0,0,0))
>>b
datetime.datetime(2009, 11, 1, 0, 0)
>>b = datetime.datetime.combine(a.date(), datetime.time(0,0,1))
>>b
datetime.datetime(2009, 11, 1, 0, 0, 1)
Run Code Online (Sandbox Code Playgroud)

python

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

pandas数据帧中的第一列不是列?

我有一个名为的数据框dfimp:

>>dfimp
           Column1    Column2
vo_11                          
102        0.023002           0
301     3571.662104           0
302     1346.910261           0
...
Run Code Online (Sandbox Code Playgroud)

在我的noob意见中它的三列?但:

>>dfimp.dtypes
Column1      float64
Column2      float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

那么它的两列呢?什么是第一个(vo_11)被称为?我想用它来进行合并但是当我这样做时我得到错误,说没有列名vo_11.

pandas

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

按数字字母分割

我想将 'E100N05' 拆分为 ['E100', 'N05'] ,因此在数字变成字母 N、E、S 或 W 后进行拆分。字母后面的位数可以不同。

import re
re.split('[NSEW$*]', 'E100N05')
Out[8]: ['', '100', '05']

What I want : ['E100','N05']
Run Code Online (Sandbox Code Playgroud)

我应该使用哪种模式?

python regex string python-3.x python-re

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

Python组和总和

我有一个元组列表:

Listoftuples=[
    (0.021892733407683305, 0.14887058717224647, 4.573173081530965, 0.04619366749021177, u'0102'),
    (0.08416364174734663, 0.8500527816482009, 23.649983331004403, 0.0, u'0103'),
    (0.02181070623592521, 0.15049387302788395, 1.2098398749067714, 1.6037412295275804, u'0102')
    ]
Run Code Online (Sandbox Code Playgroud)

我想每组(group =元组中的最后一个值,例如u'0102'):

  • 总结第一个价值
  • 汇总第二个值并除以第一个值的总和

尝试:

import itertools

Listoftuples=[
    (0.021892733407683305, 0.14887058717224647, 4.573173081530965, 0.04619366749021177, u'0102'),
    (0.08416364174734663, 0.8500527816482009, 23.649983331004403, 0.0, u'0103'),
    (0.02181070623592521, 0.15049387302788395, 1.2098398749067714, 1.6037412295275804, u'0102')
    ]

keyfunc=lambda t: (t[4])
Listoftuples.sort(key=keyfunc)

for key,rows in itertools.groupby(Listoftuples, keyfunc):
    sumOfFirstValue = sum(r[0] for r in rows)
    sumOfSecondDividedBySumOfFirst= sum(r[1] for r in rows)/sumOfFirstValue
    print key,sumOfFirstValue,sumOfSecondDividedBySumOfFirst
Run Code Online (Sandbox Code Playgroud)

结果:

0102 0.0437034396436 0.0
0103 0.0841636417473 0.0
Run Code Online (Sandbox Code Playgroud)

最后的零值.我该如何解决?

python python-itertools

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

加权平均熊猫

我有一个包含林分编号,树木种类,高度和体积的数据框:

import pandas as pd

df=pd.DataFrame.from_items([('STAND_ID',[1,1,2,3,3,3]),('Species',['Conifer','Broadleaves','Conifer','Broadleaves','Conifer','Conifer']),
                             ('Height',[20,19,13,24,25,18]),('Volume',[200,100,300,50,100,10])])

   STAND_ID      Species  Height  Volume
0         1      Conifer      20     200
1         1  Broadleaves      19     100
2         2      Conifer      13     300
3         3  Broadleaves      24      50
4         3      Conifer      25     100
5         3      Conifer      18      10
Run Code Online (Sandbox Code Playgroud)

我想按展位ID分组和取消堆叠并计算体积加权平均高度,所以我尝试:

newdf=df.groupby(['STAND_ID','Species']).mean().unstack()

          Height              Volume        
Species  Broadleaves Conifer Broadleaves Conifer
STAND_ID                                        
1               19.0    20.0       100.0   200.0
2                NaN    13.0         NaN   300.0
3               24.0    21.5        50.0    55.0
Run Code Online (Sandbox Code Playgroud)

高度当然不是体积加权平均值。我该如何称量它们的重量?对于STAND_ID 3和针叶树,如下所示:

(25 * 100 + 18 * 10)/(100 + 10)= 24.4

python pandas

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

Pandas 按两列分组,包括每组第 2 列的所有可能值

我确信这是重复的,但我找不到它。

我有这个数据框:

import pandas as pd

df = pd.DataFrame(data=[['Sweden','A',5],
                        ['Sweden','A',10],
                        ['Norway','B',4],
                        ['Norway','C',5]],
                  columns=['Country','Class','Value'])
print(df)

  Country Class  Value
0  Sweden     A      5
1  Sweden     A     10
2  Norway     B      4
3  Norway     C      5
Run Code Online (Sandbox Code Playgroud)

我想按国家和类别分组并找到它们的总和,所以我尝试:

df.groupby(['Country','Class']).sum()
               Value
Country Class       
Norway  B          4
        C          5
Sweden  A         15
Run Code Online (Sandbox Code Playgroud)

但我希望包含每个国家/地区的所有可能的课程,如下所示

               Value

Country Class       
Norway  B          4
        C          5
        A         na
Sweden  A         15
        B         na
        C         na
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

python pandas

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