熊猫DataFrame索引长度与行数不匹配

时间:2018-11-03 20:59:28

标签: python pandas dataframe multi-index

我有一个具有两个级别的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

那是我问题的一部分吗?

2 个答案:

答案 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']