[英]Pandas: Dataframe to Panel error: NotImplementedError: Only 2-level MultiIndex are supported
[英]Pandas dataframe scatter plot with 2-level Multiindex as axes
我有一个带有 2 级多索引的 dataframe df
。 我想要一个散点图 plot,x 轴为 0 级,y 轴为 1 级,所有满足条件的组合的散点,比如在特定列'col'
中具有非零值。
import matplotlib.pyplot as plt
from itertools import product
import numpy as np
lengths = [3, 2]
df_index = pd.MultiIndex.from_product([list(product([-1,1], repeat=li)) for li in lengths], names=['level1', 'level2'])
df_cols = ['cols']
df = pd.DataFrame([[0.] * len(df_cols)] * len(df_index), index=df_index, columns=df_cols)
df['cols'] = np.random.randint(0, 2, size = len(df))
df
产生以下形式的 dataframe
cols
level1 level2
(-1, -1, -1) (-1, -1) 0
(-1, 1) 0
(1, -1) 0
(1, 1) 0
(-1, -1, 1) (-1, -1) 1
(-1, 1) 0
(1, -1) 1
(1, 1) 1
(-1, 1, -1) (-1, -1) 0
(-1, 1) 0
(1, -1) 0
(1, 1) 0
(-1, 1, 1) (-1, -1) 0
(-1, 1) 0
(1, -1) 1
(1, 1) 0
(1, -1, -1) (-1, -1) 0
(-1, 1) 0
(1, -1) 1
(1, 1) 1
(1, -1, 1) (-1, -1) 0
(-1, 1) 1
(1, -1) 1
(1, 1) 0
...
现在,我想要一个散点图 plot,x 轴上的 level1 索引和 y 轴上的 level2 索引,这样对于 cols(x,y).= 0 的每个 (x,y) 都有一个点。
让我们首先创建一个具有 2 级多索引的示例 dataframe:
import pandas as pd
import numpy as np
iterables = [[1, 2, 3, 4], [0,1, 2, 3, 4,5]]
my_multiindex=pd.MultiIndex.from_product(iterables, names=['first', 'second'])
series1 = pd.Series(np.random.randn(24), index=my_multiindex)
series2 = pd.Series(np.random.randn(24), index=my_multiindex)
df=pd.DataFrame({'col1':series1,'col2':series2})
现在,让我们获取满足给定条件的索引值:
index_values=df[df.col1<0].index.values
然后我们分开x
和y
坐标:
xs=[a[0] for a in index_values]
ys=[a[1] for a in index_values]
然后我们 plot:
from matplotlib import pyplot as plt
plt.scatter(xs,ys)
如果您希望散点的大小反映实际值,您可以使用:
column_values=abs(df[df.col1<0].col1.values)
plt.scatter(xs,ys,s=column_values*10)
编辑以反映已编辑的问题:
您只需要将xs
和ys
转换为字符串。 我还使用了一个大图,以便轴刻度标签不重叠:
plt.figure(figsize=(10,10))
plt.scatter([str(a) for a in xs],[str(a) for a in ys])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.