我正在尝试将嵌套的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) 我想切片数据帧以返回元素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的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) 如何有效地将已排序的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) 我希望能够在白色背景上以 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)
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) 这是我想解决的问题: 我希望能够通过单击绘图以交互方式(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
我希望以高效的方式在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) 我想绘制 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)
有人可以建议我吗?
我希望列的颜色由它们在 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)
这是目前使用默认设置的样子。我认为有一种简单优雅的方法可以做到这一点,但对任何解决方案都感兴趣。
使用熊猫在一条线上实现这一目标的最优雅方式是什么?
初始点:
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)