Извлечение значений индекса многоиндексного фрейма данных в виде простого списка в python

#python #pandas #list #dataframe #indexing

#python #pandas #Список #фрейм данных #индексирование

Вопрос:

Я извлек значения индекса из фрейма данных pandas и хочу добавить их в виде столбца в новый фрейм данных. Но python выдает ошибку, указывающую, что извлеченный индекс имеет структуру (строки x столбцы) в качестве фрейма данных, из которого он был извлечен.

Как мне извлечь значения индекса фрейма данных в виде простого списка, который можно использовать как обычный список?

Ошибка:

 ValueError: Shape of passed values is (10, 1), indices imply (10, 10)
 

Что я пробовал:

 ## 1
pd.DataFrame(subset_df.index, subset_df[var], percentiles, percentiles_main)

## 2
ix = subset_df.index.get_level_values('College').tolist()
pd.DataFrame(ix, subset_df[var], percentiles, percentiles_main)

## 3
ix =  [i for i in subset_df.index.get_level_values('College')]
pd.DataFrame(ix, subset_df[var], percentiles, percentiles_main)

## 4
ix =  [i for i in subset_df.index.get_level_values('College').values]

## 5
ix =  [i for i in subset_df.index.get_level_values('College').values.tolist()]

## 6
ix =  subset_df.index.get_level_values('College').to_numpy()

## 7
ix = [i for i in subset_df.index.get_level_values('College').array]

## 8
pd.DataFrame(pd.IndexSlice[ix], percentiles, percentiles_main)

## 9
import operator
index = subset_df.index.tolist()
desired_index = list(set(map(operator.itemgetter(1), index)))
pd.DataFrame(desired_index, ptiles, ptiles_main)

 

Все вышеперечисленные подходы дали одинаковое значение ошибки.

Чтобы воссоздать проблему:

 import numpy as np
import pandas as pd

# Import data
url = "https://statlearning.com/College.csv"
dfo = pd.read_csv(url)
dfo.head(1)

# Add college names as 2nd index
df = dfo.set_index('Unnamed: 0', append=True)
df.rename_axis(index=['SN', 'College'], inplace=True)

# Created a subset of dataframe
subset_df = df.sort_values(by='Top10perc', axis=0, ascending=False)[0:10]
subset_df

# Calculation of percentiles
from scipy.stats import percentileofscore as prtl
ptiles_main = [round(prtl(df['Top10perc'],i,'weak'),2) for i in subset_df['Top10perc']]
ptiles = [round(prtl(df['Grad.Rate'],i,'weak'),2) for i in subset_df['Grad.Rate']]

# Creating a new dataframe with college names and percentiles
## this is where I'm getting ValueError
pd.DataFrame(subset_df.index.get_level_values('College').values.tolist(), ptiles, ptiles_main)
#> ValueError: Shape of passed values is (10, 1), indices imply (10, 10)

# this is the output without trying to add index
pd.DataFrame(ptiles, ptiles_main)
#             0
# 100.00  94.98
# 99.87   76.06
# 99.87   99.87
# 99.87   98.58
# 99.49   97.30
# 99.49   98.58
# 99.49   99.87
# 99.10   61.39
# 98.97   97.94
# 98.97   97.30
 

Желаемый результат:
введите описание изображения здесь

Мой вопрос состоит из 2 частей:
(более важная часть)
1) Как извлечь значения индекса фрейма данных в виде простого списка, который можно использовать любым способом, можно использовать обычный список

(дополнительная часть)
2) Как добавить названия колледжей в ptile_df

Комментарии:

1. Можете ли вы опубликовать некоторые данные и ожидаемые результаты?

2. Я опубликовал данные и желаемый результат.

Ответ №1:

Ошибка возникает из-за того, как вы пытаетесь создать фрейм данных. Попробуйте сделать это так:

 pd.DataFrame({'College':subset_df.index.get_level_values('College').tolist(), 
              'Grad.Rate':subset_df['Grad.Rate'].values,
              'Percentile':ptiles, 'Percentile_main':ptiles_main})
 

или

 ptile_df = pd.concat([pd.Series(subset_df.index.get_level_values('College')), 
           pd.Series(subset_df['Grad.Rate'].values), pd.Series(ptiles), 
           pd.Series(ptiles_main)], axis=1)
ptile_df.columns = ['College','Grad.Rate','Percentile','Percentile_main']
 

Ответ №2:

Если ваш набор данных похож:

 arrays = [np.array(["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"]),
          np.array(["one", "two", "one", "two", "one", "two", "one", "two"])]
df = pd.Series(np.random.randn(8), index=arrays)

bar  one    1.421473
     two    0.298886
baz  one    1.538157
     two   -0.229495
foo  one    2.686094
     two    1.177376
qux  one    1.550625
     two   -0.142154
 

Если вы хотите получить первый индекс в виде списка, вы можете сделать следующее:

 import operator
index = df.index.tolist()
print(index)
[('bar', 'one'), ('bar', 'two'), ('baz', 'one'), ('baz', 'two'), ('foo', 'one'), ('foo', 'two'), ('qux', 'one'), ('qux', 'two')]

desired_index = list(set(map(operator.itemgetter(0), index)))
print(desired_index)
['qux', 'baz', 'foo', 'bar']
 

Комментарии:

1.Этот подход также дал то же значение, что и в ValueError: Shape of passed values is (10, 1), indices imply (10, 10) моем коде: import operator index = subset_df.index.tolist() desired_index = list(set(map(operator.itemgetter(1), index))) pd.DataFrame(desired_index, ptiles, ptiles_main)

Ответ №3:

Еще один подход:

 ptile_df = pd.DataFrame(
    np.column_stack([subset_df.index.get_level_values('College').tolist(), 
                     subset_df['Grad.Rate'], ptiles, ptiles_main]))
ptile_df.columns = ['College', 'Grad.Rate', 'Percentile', 'Percentile_Main']
ptile_df
 

Ответ №4:

Это то, что вы пытаетесь сделать?

 print(df)
print('______________')

index_list = [i for i in range(len(df))]
df["index"] = index_list
print(df)
 

введите описание изображения здесь

Комментарии:

1. Это не то, что я ищу.