我有一个具有两个级别的MultiIndex的DataFrame:“状态”和“区域名称”(如果有人在Coursera上完成了Python的应用数据科学专业化,那是第一堂课的最后一个项目)。
我正在尝试使索引的“ RegionName”级别成为DataFrame的列,并使用它来创建布尔掩码。
我尝试了以下操作:
housing_data['Town'] = housing_data.index.levels[1]
我得到一个错误:“值的长度与索引的长度不匹配”
我试图弄清楚这是怎么回事,因为我实际上是在使用DataFrame的索引将列添加到同一DataFrame中。长度怎么不匹配?
如果它增加了任何其他见解:
np.shape(housing_data) returns (10730, 69)
len(housing_data.index) returns 10730
yet somehow len(housing_data.index.levels[1]) returns 8258
那是我问题的一部分吗?
答案 0 :(得分:0)
您是否尝试过重置?
/**
* @Route("/student/details/edit")
*/
public function editStudentAction(Request $request)
{
$user = $this->get('security.token_storage')->getToken()->getUser();
$em = $this->getDoctrine()->getManager();
$student = $em->getRepository('AppBundle:Student')
->findOneBy(['userId'=>$user->getId()]);
$categoryQuery = $em->getRepository('AppBundle:SkillCategory')->findAll();
$form = $this->createFormBuilder($student)
->add('university',TextType::class)
->add("course",TextType::class)
->add("location",IntegerType::class)
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
if($form->isValid()) {
$review_data = $form->getData();
$em->persist($review_data);
$em->flush();
$this->addFlash('success', 'Your Review has been added');
return $this->redirect('/profile');
} else {
return new Response("form is not valid");
}
} else {
//return new Response("not correct");
}
return $this->render('student/editStudent.html.twig',array(
"editStudentForm" => $form->createView(),
"skillCategorys" => $categoryQuery,
));
}
答案 1 :(得分:0)
TLDR;跳到最后一部分(首先无需为布尔掩码创建新列!)
现在,要实际回答您的问题...
您的DataFrame没有任何问题!使用您的方法,您只缺少一个步骤。从.levels[]
获取值只是第一步。
import pandas as pd
import numpy as np
iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]
mult_index = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 3), index=mult_index, columns=['A', 'B', 'C'])
mult_index # same as df.index
这将输出:
MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], ['one', 'two']],
labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],
names=['first', 'second'])
从这里,您将看到返回levels
值是不够的。您还必须将这些值映射到适当的labels
值上。 labels
的长度将与行数相同。
df['index_val1'] = [ mult_index.levels[0][i] for i in mult_index.labels[0]]
或
df['index_val1'] = [ df.index.levels[0][i] for i in df.index.labels[0]]
不过,此映射有一个内置函数!
df['index_val1'] = df.index.get_level_values(0)
实际上,您可以使用get_level_values
进行所有的布尔掩码。 无需创建其他列。
df[ df.index.get_level_values(0)=='bar']