Jupyter/ipywidgets 在两个级别上对数据帧进行排序
Posted
技术标签:
【中文标题】Jupyter/ipywidgets 在两个级别上对数据帧进行排序【英文标题】:Jupyter/ipywidgets sorting dataframe on two levels 【发布时间】:2017-09-13 06:24:33 【问题描述】:Google 让我失望了,所以希望有人可以帮助我。
我正在使用 Jupyter 笔记本。我有一个数据框,并且正在尝试设置交互式小部件来对该数据框进行排序。
数据框是关于运动员的。我正在尝试按运动员姓名对数据框进行排序,然后按运动员参加的学科对其进行排序。所以,我希望能够选择“Jon”,然后在选择“Jon”之后,我希望能够缩小返回的数据范围,以便我可以查看“乔恩”的三级跳远(并且只有三级跳远)(如果选择),但如果我选择该选项,则可以切换到查看“乔恩”的跳远结果。
data = pd.read_csv("Athlete Rank Moments.csv", encoding = "latin-1", usecols = [0, 1, 2, 4, 5, 16],
parse_dates = True, infer_datetime_format = True)
data["RankDate"] = pd.to_datetime(data["RankDate"], errors="coerce")
items = ['All']+sorted(data["Person/Team"].unique().tolist())
discipline_items = ['All']+sorted(data["Discipline"].unique().tolist())
def view(x='', y=''):
if x == 'All': return data
return data[data['Person/Team','Discipline']==x]
w = widgets.Select(options=items)
z = widgets.Select(options = discipline_items)
v = interact(view, x=w, y=z)
display(v)
这段代码给了我两个下拉菜单,但是“discipline_list”的下拉菜单根本不会改变返回的数据。很明显,这是因为视图函数没有对它做任何事情,但我不知道在视图函数中写什么才能得到我想要的结果。任何帮助将不胜感激!
【问题讨论】:
您能提供一个虚拟版本的 DataFrame 吗?谢谢。 【参考方案1】:您可以做到这一点的一种方法是将您的view
函数分解为两个单独的函数。第一个根据“Person/Team”过滤DataFrame并返回结果。第二个函数调用第一个获取结果,然后根据“纪律”过滤并显示 DataFrame。然后你在第二个函数上调用交互。像这样;
def view_1(x=""):
if x == 'All':
return data
else:
return data[data['Person/Team']==x]
def view_2(x="", y=""):
data_2 = view_1(x)
if y == 'All':
display(data_2)
else:
display(data_2[data_2["Discipline"]==y])
w = widgets.Select(options=items)
z = widgets.Select(options=discipline_items)
v = interact(view_2, x=w, y=z)
display(v)
我已经在 DataFrames 上测试了类似的函数,我正在处理这些函数并获得了积极的结果,但我不能保证这对你有用,因为你的问题缺少示例 DataFrame。无论如何希望对您有所帮助!
【讨论】:
以上是关于Jupyter/ipywidgets 在两个级别上对数据帧进行排序的主要内容,如果未能解决你的问题,请参考以下文章
本地存储如何在域级别上工作?两个站点使用相同的密钥来存储数据? [复制]
在 pandas 多索引数据帧上绘制两个级别的 x_ticklabels [重复]