小编the*_*ist的帖子

Pandas json_normalize会产生令人困惑的`KeyError`消息?

我正在尝试将嵌套的JSON转换为Pandas数据帧.我一直在json_normalize成功使用,直到遇到某个JSON.我已经制作了一个较小的版本来重现问题.

from pandas.io.json import json_normalize

json=[{"events": [{"schedule": {"date": "2015-08-27",
     "location": {"building": "BDC", "floor": 5},
     "ID": 815},
    "group": "A"},
   {"schedule": {"date": "2015-08-27",
     "location": {"building": "BDC", "floor": 5},
 "ID": 816},
"group": "A"}]}]
Run Code Online (Sandbox Code Playgroud)

然后我跑:

json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
Run Code Online (Sandbox Code Playgroud)

期待看到这样的事情:

ID      group   schedule.date   schedule.location.building schedule.location.floor  
'815'   'A'     '2015-08-27'            'BDC'                       5
'816'   'A'     '2015-08-27'            'BDC'                       5
Run Code Online (Sandbox Code Playgroud)

但相反,我得到这个错误:

In [2]: json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-b588a9e3ef1d> in <module>()
----> 1 json_normalize(json[0],'events',[['schedule','date'],['schedule','location','building'],['schedule','location','floor']])

/Users/logan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/io/json.pyc in json_normalize(data, record_path, meta, meta_prefix, record_prefix)
    739                 records.extend(recs)
    740
--> 741     _recursive_extract(data, …
Run Code Online (Sandbox Code Playgroud)

python json dictionary pandas

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

切片pandas df基于n个连续的元素实例

我想切片数据帧以返回元素x = 0连续出现至少 n = 3次的行,然后在每个迷你序列中丢弃第一个i = 2个实例

有没有一种有效的方法来实现大熊猫,如果没有,使用numpy或scipy?

import pandas as pd
import numpy as np
Run Code Online (Sandbox Code Playgroud)

例1

df=pd.DataFrame({'A':[0,1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,1],'B':np.random.randn(17)})

    A         B
0   0  0.748958
1   1  0.254730
2   0  0.629609
3   0  0.272738
4   1 -1.885906
5   1  1.206371
6   0 -0.332471
7   0  0.217553
8   0  0.768986
9   0 -1.607236
10  1  1.613650
11  1 -1.096892
12  0 -0.435762
13  0  0.131284
14  0 -0.177188
15  1  1.393890
16  1  0.174803
Run Code Online (Sandbox Code Playgroud)

期望的输出:

    A         B
8   0 …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy pandas

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

如何在scrollable,matplotlib和multiplot中更新艺术家

我正在尝试根据这个问题的答案创建一个可滚动的多画面: 用python的pylab创建一个可滚动的多画面

使用ax.plot()正确更新的行,但是我无法弄清楚如何更新使用xvlines()和创建的艺术家fill_between().

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib.widgets import Slider

#create dataframes
dfs={}
for x in range(100):
    col1=np.random.normal(10,0.5,30)
    col2=(np.repeat([5,8,7],np.round(np.random.dirichlet(np.ones(3),size=1)*31)[0].tolist()))[:30]
    col3=np.random.randint(4,size=30)
    dfs[x]=pd.DataFrame({'col1':col1,'col2':col2,'col3':col3})

#create figure,axis,subplot
fig = plt.figure()
gs = gridspec.GridSpec(1,1,hspace=0,wspace=0,left=0.1,bottom=0.1)
ax = plt.subplot(gs[0])
ax.set_ylim([0,12])

#slider
frame=0
axframe = plt.axes([0.13, 0.02, 0.75, 0.03])
sframe = Slider(axframe, 'frame', 0, 99, valinit=0,valfmt='%d')

#plots
ln1,=ax.plot(dfs[0].index,dfs[0]['col1'])
ln2,=ax.plot(dfs[0].index,dfs[0]['col2'],c='black')

#artists
ax.fill_between(dfs[0].index,y1=dfs[0]['col2']-0.5,y2=dfs[0]['col2']+0.5,where=dfs[0]['col2']==5,facecolor='r',edgecolors='none',alpha=0.5)
ax.fill_between(dfs[0].index,y1=dfs[0]['col2']-0.5,y2=dfs[0]['col2']+0.5,where=dfs[0]['col2']==8,facecolor='b',edgecolors='none',alpha=0.5)
ax.fill_between(dfs[0].index,y1=dfs[0]['col2']-0.5,y2=dfs[0]['col2']+0.5,where=dfs[0]['col2']==7,facecolor='g',edgecolors='none',alpha=0.5)
ax.vlines(x=dfs[0]['col3'].index,ymin=0,ymax=dfs[0]['col3'],color='black')

#update plots
def …
Run Code Online (Sandbox Code Playgroud)

python slider matplotlib

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

如何将numpy数组中的相同元素移动到子数组中

如何有效地将已排序的numpy数组中的相同元素移动到子数组中?

从这里:

import numpy as np     
a=np.array([0,0,1,1,1,3,5,5,5])
Run Code Online (Sandbox Code Playgroud)

到这里:

a2=array([[0, 0], [1, 1, 1], [3], [5, 5, 5]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

python numpy python-itertools

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

在matplotlib中的白色背景上计算alpha为0.5的基色的RGB等价物

我希望能够在白色背景上以 0.5 的 alpha 复制 matplotlib 中原色('r'、'g' 或 'b')的外观,同时将 alpha 保持在 1。

下面是一个示例,通过手动实验,我发现 alpha 为 1 的 RGB 值看起来类似于 matplotlib 默认颜色的 alpha 0.5。

我想知道是否有人有实现这一目标的自动化方法。

import matplotlib.pyplot as plt

s=1000

plt.xlim([4,8])
plt.ylim([0,10])

red=(1,0.55,0.55)
blue=(0.55,0.55,1)
green=(0.54,0.77,0.56)

plt.scatter([5],[5],c='r',edgecolors='none',s=s,alpha=0.5,marker='s')
plt.scatter([6],[5],c='b',edgecolors='none',s=s,alpha=0.5,marker='s')
plt.scatter([7],[5],c='g',edgecolors='none',s=s,alpha=0.5,marker='s')

plt.scatter([5],[5.915],c=red,edgecolors='none',s=s,marker='s')
plt.scatter([6],[5.915],c=blue,edgecolors='none',s=s,marker='s')
plt.scatter([7],[5.915],c=green,edgecolors='none',s=s,marker='s')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

python rgb alpha matplotlib alpha-transparency

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

根据列表重新排列pandas数据帧的行并保持顺序

import numpy as np 
import pandas as pd

df = pd.DataFrame(data={'result':[-6.77,6.11,5.67,-7.679,-0.0930,4.342]}\
,index=['A','B','C','D','E','F'])
new_order = np.array([1,2,2,0,1,0])
Run Code Online (Sandbox Code Playgroud)

所述new_ordernumpy的阵列分配的每一行至三个基团[0,1或2]中的一个.我想重新排列行,df以便第0组中的那些行首先显示,然后是1,最后是2.在三组中的每一组中,初始排序应保持不变.

在开始时,df的排列如下:

   result
A  -6.770
B   6.110
C   5.670
D  -7.679
E  -0.093
F   4.342
Run Code Online (Sandbox Code Playgroud)

给出上述输入数据,这是所需的输出.

   result
D  -7.679
F   4.342
A  -6.770
E  -0.093
B   6.110
C   5.670
Run Code Online (Sandbox Code Playgroud)

numpy pandas

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

在 matplotlib 中交互式添加和删除散点

这是我想解决的问题: 我希望能够通过单击绘图以交互方式(i)删除散点(灰点),(ii)添加新的散点。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(16,4))
a = np.sin(range(100))*np.random.normal(20,10,100)
b = [ 5, 15, 25, 30, 40, 50, 75, 85]

aa = plt.plot(range(len(a)),a,color='red')
bb = plt.scatter(b,a[b],color='grey',s=50)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

python animation matplotlib event-handling python-interactive

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

pd.corrwith带有不同列名的pandas数据帧

我希望以高效的方式在x1和y中的三列中的每一列之间获得pearson r.

似乎pd.corrwith()只能为具有完全相同列标签(例如x和y)的列计算此值.

这似乎有点不切实际,因为我认为计算不同变量之间的相关性将是一个常见问题.

In [1]: import pandas as pd; import numpy as np

In [2]: x = pd.DataFrame(np.random.randn(5,3),columns=['A','B','C'])

In [3]: y = pd.DataFrame(np.random.randn(5,3),columns=['A','B','C'])

In [4]: x1 = pd.DataFrame(x.ix[:,0])

In [5]: x.corrwith(y)
Out[5]:
A   -0.752631
B   -0.525705
C    0.516071
dtype: float64

In [6]: x1.corrwith(y)
Out[6]:
A   -0.752631
B         NaN
C         NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)

python pandas

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

如何在matplotlib中以'%H:%M'格式在y轴上绘制时间?

我想绘制 datetime64 系列中的时间,其中 y 轴的格式为 '%H:%M,仅显示 00:00、01:00、02:00 等。

这就是没有自定义 y 轴格式的绘图的样子。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
from matplotlib.dates import HourLocator

df = pd.DataFrame(data=dict(a=pd.date_range('1/1/2011',periods=1440000,freq='1min')))
df = df.iloc[np.arange(0,1440*100,1440)+np.random.randint(1,300,100)]

plt.plot(df.index,df['a'].dt.time)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在阅读关于 SO 的主题后,我尝试了以下但没有成功。

ax = plt.subplot()
ax.yaxis.set_major_locator(HourLocator())
ax.yaxis.set_major_formatter(DateFormatter('%H:%M'))
plt.plot(df.index,df['a'].dt.time)
plt.show()

ValueError: DateFormatter found a value of x=0, which is an illegal date.  This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()
Run Code Online (Sandbox Code Playgroud)

有人可以建议我吗?

python matplotlib python-datetime pandas

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

在seaborn barplot中按列值定义色调

我希望列的颜色由它们在 x 轴上的值确定,例如,在 x 轴上具有相同值的条应该分配给它们相同的颜色。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd 

df = pd.DataFrame(index=['A','B','C','D','E','F'],data={'col1':np.array([2.3423,4.435,9.234,9.234,2.456,6.435])})
ax = sns.barplot(x='col1', y=df.index.values, data=df,palette='magma')
Run Code Online (Sandbox Code Playgroud)

这是目前使用默认设置的样子。我认为有一种简单优雅的方法可以做到这一点,但对任何解决方案都感兴趣。

在此处输入图片说明

matplotlib seaborn

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

2列值 - > 1列值+ 1个pandas中的标签列

使用熊猫在一条线上实现这一目标的最优雅方式是什么?

初始点:

import pandas as pd
df = pd.DataFrame({'A':[0.2,0.3,0.1,0.45], 'B':[0.5,0.8,0.15,0.55]})

i   A     B
0   0.2   0.5
1   0.3   0.8
2   0.1   0.15
3   0.45  0.55
Run Code Online (Sandbox Code Playgroud)

期望的终点:

i   value  label
0   0.2    A
1   0.3    A
2   0.1    A
3   0.45   A
4   0.5    B
5   0.8    B
6   0.15   B
7   0.55   B
Run Code Online (Sandbox Code Playgroud)

python pandas

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