Учебник по использованию DataFrame структуры данных Pandas

искусственный интеллект Python

1. Введение в DataFrame

DataFrame один в PandasТабличныйСтруктура данных содержит упорядоченный набор столбцов, каждый из которых может иметь различный тип значения (целое число, число с плавающей запятой, логическое значение, строка и т. д.), а DataFrame имеет индексы строк и столбцов, которые можно рассматривать какSeriesсоставленный словарь

DataFrame также можно понимать как с行和列标签2D-массив:

- Name Age Sex
0 Ли Хуа 20 female
1 Хан Мэймэй 19 female
2 Ли Лей 21 male

Метки строк — это серийные номера 0, 1, 2, а метки столбцов — имя, возраст, пол. DataFrame — наиболее часто используемый объект Pandas. Как и Series, DataFrame поддерживает несколько типов входных данных:

  • Список, одномерный ndarray, словарь, словарь серий
  • 2D ndarray
  • Series
  • DataFrame

В дополнение к данным вы можете дополнительно передавать параметры индекса (метки строк) и столбцов (метки столбцов). Передача индекса или столбцов гарантирует, что результирующий DataFrame содержит индексы или столбцы. При добавлении указанного индекса в словарь Series любые данные, не соответствующие переданному индексу, отбрасываются.

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

2. Создание экземпляра DataFrame

DataFrames можно создавать с помощью словарей, списков и т. д.

Если входящие данные всескалярное значение(Например, словарь: {'a':1, 'b':2}), то параметр index должен быть передан в

df = pd.DataFrame({
    'name': ['lihua', 'lilei', 'hanmeimei', 'xiaoming', 'xiaohong'],
    'math': [99, 100, 80, 50, 118],
    'english': [94, 83, 99, 79, 108],
    'chinese': [107, 82, 76, 100, 113]
})
Output:
        name  math  english  chinese
0      lihua    99       94      107
1      lilei   100       83       82
2  hanmeimei    80       99       76
3   xiaoming    50       79      100
4   xiaohong   118      108      113

3. Выбор данных строки

1. Выберите данные строки по положению (выбор одной строки)

Когда мы хотим выбрать N-ю строку данных (теоретически N должно быть меньше или равно самой большой строке, которую можно выбрать), мы можем выбрать ее следующими способами:

df.iloc[1]
Output:
    name  math  english  chinese
1  lilei   100       83       82

В этом примере мы использовалиilocметод делает выбор данных строки на основе местоположения, и не только этоilocОн также поддерживает такие функции, как нарезка строк, выбор нескольких строк и т. д. Для конкретного использования см. следующий раздел.

2. Выберите данные строки по положению (выбор нескольких строк: аналогично нарезке)

Метод 1: когда мы хотим выбрать первые N (теоретически N должно быть меньше или равно наибольшей строке, которую можно получить) или последние N строк данных, мы можем выбрать следующие способы:

df.head(2) # 取前两行数据

Output:
    name  math  english  chinese
0  lihua    99       94      107
1  lilei   100       83       82

df.tail(2) # 取最后两行数据
Output:
       name  math  english  chinese
3  xiaoming    50       79      100
4  xiaohong   118      108      113

Метод 2: Или мы также можем использовать нарезку строк, чтобы получить данные первых (обратных) N строк:

df[0:2] # 从第一行开始取,一共取两行(不包含位置为2的那行数据,只取位置下标为0,1的两行数据)

Output:
    name  math  english  chinese
0  lihua    99       94      107
1  lilei   100       83       82

df[-2:] # 从第倒查第二行开始取,一直取到末尾。

Output:
       name  math  english  chinese
3  xiaoming    50       79      100
4  xiaohong   118      108      113

Способ нарезки строк аналогичен тому, что используется в базовой структуре данных Python.Нарезка списков, поэтому нарезка строк также поддерживает нарезку в средней части, нарезку в конце и т. д. Дополнительные методы использования см. в части списка.

Способ 3. Точно так же мы можем использовать класс DataFrame.ilocметод на DataFrameсрез строки:

df.iloc[0:2] # 从第一行开始取,一共取两行(不包含位置为2的那行数据,只取位置下标为0,1的两行数据)

Output:
    name  math  english  chinese
0  lihua    99       94      107
1  lilei   100       83       82

df.iloc[-2:] # 从第倒查第二行开始取,一直取到末尾。

Output:
       name  math  english  chinese
3  xiaoming    50       79      100
4  xiaohong   118      108      113

df.iloc[[0, 1, 3]] # 取第一行,第二行、以及第四行数据

Output:
       name  math  english  chinese
0     lihua    99       94      107
1     lilei   100       83       82
3  xiaoming    50       79      100

При использовании метода iloc для среза используйте df.iloc[[0,1]] для достижения того же эффекта, что и df.iloc[0:2]. Вы можете попробовать это сами, чтобы увидеть эффект.

Нарезка строк примерно аналогична нарезке iloc, но следует отметить, что нарезка iloc более гибкая. Использование iloc может не только выполнять срезы, но и поддерживать прерывистые срезы, см. приведенный выше пример (просто передать массив позиций строки, которую нужно получить), и iloc также может получить указанную одиночную строку (см. пример в следующем подразделе). )

3. Выберите данные одной (несколько) строк по значению индекса

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

df.loc[0] #获取索引值为0的那一行的数据

Output:
       name  math  english  chinese
0     lihua    99       94      107

df.loc[[1,3]] #获取索引值为1和3的行数据

Output:
       name  math  english  chinese
1     lilei   100       83       82
3  xiaoming    50       79      100

вышеlocЗначение параметра, переданное в примере, является значением индекса при создании экземпляра DataFrame,Это не ценность позиции и не может быть понята как позиция.. Поскольку мы не передали параметр индекса при создании экземпляра DataFrame в этом примере, будет сгенерирована последовательность индексов по умолчанию (инкрементная последовательность, начинающаяся с 0), поэтому последовательность индексов в этом примере точно такая же, как последовательность позиций, поэтому причинаlocиilocНет иллюзии различия. В реальном использовании, если последовательность индекса (index) ['a', 'b', 'c', 'd', 'e'], то, если мы используем loc для получения данных строки, параметры, которые должны быть переданы in — значение в последовательности индексов.

locиilocРазница не только отражена в том, что первый основан на индексе, второй основан на выборе данных строки на основе местоположения, и в то же времяlocтакже поддерживаетВыберите указанные данные столбца:

df.loc[[0, 1], ['name', 'math']] #获取前两行数据,同时指定列数据为name和math

Output:
    name  math
0  lihua    99
1  lilei   100

4. Выберите указанные данные строки по условию (bool)

DataFrame помогает нам получать указанные данные строки в соответствии с пользовательскими условиями поиска, такими как name='xxx' или 15

df[df['name'] == 'lihua'] #选取dataFrame中,name属性等于lihua的所有行数据

Output:
    name  math  english  chinese
0  lihua    99       94      107

df[df['math'].between(90, 100)] #选取dataFrame中,math值在90到100之间的行数据

Output:
    name  math  english  chinese
0  lihua    99       94      107
1  lilei   100       83       82

df[df['english'] > 100] #选取dataFrame中,english值在大于100的行数据

Output:
       name  math  english  chinese
4  xiaohong   118      108      113

df[df['name'].isin(['hanmeimei', 'xiaoming'])] #选取dataFrame中,name属性符合['hanmeimei', 'xiaoming']的所有行数据

Output:
        name  math  english  chinese
2  hanmeimei    80       99       76
3   xiaoming    50       79      100

в настоящее время используюbetweenПри извлечении данных интервала, если вы не хотите включать значения на обоих концах (удовлетворяя тем, что значения на обоих концах не извлекаются), вам нужно только поставитьinclusiveЛожная банка

4. Выбор данных столбца

Выбор данных столбца намного проще, чем выбор данных строки. Для выбора данных столбца мы можем использовать только значение столбца, чтобы получить соответствующие данные столбца:

df['name'] #获取DataFrame中column为name的列数据

Output:
0        lihua
1        lilei
2    hanmeimei
3     xiaoming
4     xiaohong
Name: name, dtype: object

df.name # 等价于df['name']

Output:
0        lihua
1        lilei
2    hanmeimei
3     xiaoming
4     xiaohong
Name: name, dtype: object

df[['name', 'math']] #获取DataFrame中column为name和math的列数据

Output:
        name  math
0      lihua    99
1      lilei   100
2  hanmeimei    80
3   xiaoming    50
4   xiaohong   118

df.loc[:, ['name', 'math']] #等价于df[['name', 'math']],获取所有的行,同时限定column为 name和math

Output:
        name  math
0      lihua    99
1      lilei   100
2  hanmeimei    80
3   xiaoming    50
4   xiaohong   118

Как видно из приведенного выше примера, мы также можем использовать значение одного столбца или нескольких столбцов для полученияlocметод, но сначала ослабьте условия для получения данных строки в loc (получите все строки, равные без ограничений)