dataframe data filter_down
Это будет последний пост о фильтрации данных DataFrame, посвященный использованию 3 пар функций:
- iloc и loc, самые важные, пара часто используемых функций
- в и иат
- каждый и все
Важные учебные материалы:pandas.друзья попали на него.org/pandas-docs…
Расширенное чтение
Способы снятия чисел пандами действительно разнообразны, и есть много функций и навыков, которые нам нужно освоить и накопить самостоятельно. Две предыдущие статьи:
Данные моделирования
В этой статье моделируются два набора данных:
- Индекс первой копии - тип символа
- Второй индекс использует числовой тип по умолчанию.
import pandas as pd
import numpy as np
# 第一份模拟数据df0
df0 = pd.DataFrame(
[[101, 102, 140], [114, 95, 67], [87, 128, 117]],
index=['语文', '数学', '英语'],
columns=['小明', '小红',"小孙"])
df0
# 第二份模拟数df
df = pd.DataFrame({
"name":['小明','小王','张菲','关宇','孙小小','王建国','刘蓓'],
"sex":['男','女','女','男','女','男','女'],
"age":[20,23,18,21,25,21,24],
"score":[np.nan,600,550,np.nan,610,580,634], # 缺失两条数据
"address":[
"广东省深圳市南山区",
np.nan, # 数据缺失
"湖南省长沙市雨花区",
"北京市东城区",
"广东省广州市白云区",
"湖北省武汉市江夏区",
"广东省深圳市龙华区"
]
})
df
илок и лок
iloc фильтрует по значению, loc фильтрует по атрибуту или имени индекса строки
iloc
Непосредственно укажите значение и выньте одну строку записей
# 1、使用数值
df1 = df.iloc[1] # 单个数值取出的行记录
df1
# 结果
name 小王
sex 女
age 23
score 600.0
address NaN
Name: 1, dtype: object
Используйте двоеточие для всех
df1 = df.iloc[1,:] # :冒号表示全部
df1
# 结果
name 小王
sex 女
age 23
score 600.0
address NaN
Name: 1, dtype: object
Вы также можете использовать срезы для получения чисел:
df1 = df.iloc[:3] # 取出前3行记录
df1
Выньте непоследовательные многострочные записи:
df2 = df.iloc[[1,2,4]] # 取出多行记录
df2
|
name |
sex |
age |
score |
address |
1 |
маленький король |
Женский |
23 |
600.0 |
NaN |
2 |
Чжан Фэй |
Женский |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
4 |
Сунь Сяосяо |
Женский |
25 |
610.0 |
Район Байюнь, город Гуанчжоу, провинция Гуандун |
# 2、取出行记录的部分列属性
df3 = df.iloc[2,0:2]
df3
# 结果
name 张菲
sex 女
Name: 2, dtype: object
# 列方向上使用切片,步长为2
df4 = df.iloc[2,0:5:2]
df4
# 结果
name 张菲
age 18
address 湖南省长沙市雨花区
Name: 2, dtype: object
# 行索引为2,列索引号为1 和 3
df5 = df.iloc[2,[1,3]]
df5
# 结果
sex 女
score 550.0
Name: 2, dtype: object
# 3、取出具体的值
df6 = df.iloc[2,4]
df6
# 结果
'湖南省长沙市雨花区'
Срезы используются как для строк, так и для столбцов, а также можно указать размер шага:
# 4、行和列方向同时使用切片
df7 = df.iloc[0:4,0:6:2]
df7
Сравните с исходными данными:
! ! ! Очень полезный метод: np.r_, который помогает нам удалить непоследовательные атрибуты столбцов.
# 5、取出不连续的行列数据,使用np.r_
df8 = df.iloc[:, np.r_[0,2:4]]
df8
|
name |
age |
score |
0 |
Сяо Мин |
20 |
NaN |
1 |
маленький король |
23 |
600.0 |
2 |
Чжан Фэй |
18 |
550.0 |
3 |
Гуань Юй |
21 |
NaN |
4 |
Сунь Сяосяо |
25 |
610.0 |
5 |
Ван Цзянго |
21 |
580.0 |
6 |
Лю Бэй |
24 |
634.0 |
df9 = df.iloc[np.r_[0,2:4],:]
df9
|
name |
sex |
age |
score |
address |
0 |
Сяо Мин |
мужчина |
20 |
NaN |
Район Наньшань, город Шэньчжэнь, провинция Гуандун |
2 |
Чжан Фэй |
Женский |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
3 |
Гуань Юй |
мужчина |
21 |
NaN |
Район Дунчэн, Пекин |
loc
Используйте имя индекса строки или атрибут столбца, чтобы напрямую получить число
# 1、取出单个列
df10 = df.loc[:,"name"]
df10
0 小明
1 小王
2 张菲
3 关宇
4 孙小小
5 王建国
6 刘蓓
Name: name, dtype: object
# 2、取数多个列
df11 = df.loc[:,["name","age"]]
df11
# 3、使用数值,取出第一行,索引为0
df12 = df.loc[0]
df12
name 小明
sex 男
age 20
score NaN
address 广东省深圳市南山区
Name: 0, dtype: object
# 4、取出索引为0,1,3的行记录,此时列字段是全部保留
df13 = df.loc[[0,1,3]]
df13
# 使用冒号:,表示全部列,效果同上
df14 = df.loc[[0,1,3],:]
df14
# 5、取出部分行和部分列
df15 = df.loc[[0,1,3],["name","sex","score"]]
df15
# 6、!!!使用索引切片:同时包含起止位置
df16 = df.loc[0:3]
df16
df.loc[:] # 表示所有数据
# 7、列筛选的时候,必须有行元素
# 所有行的name和score两列
df17 = df.loc[:,["name","score"]]
df17
|
name |
score |
0 |
Сяо Мин |
NaN |
1 |
маленький король |
600.0 |
2 |
Чжан Фэй |
550.0 |
3 |
Гуань Юй |
NaN |
4 |
Сунь Сяосяо |
610.0 |
5 |
Ван Цзянго |
580.0 |
6 |
Лю Бэй |
634.0 |
# 所有行的age及后面全部列
df18 = df.loc[:,"age":]
df18
|
age |
score |
address |
0 |
20 |
NaN |
Район Наньшань, город Шэньчжэнь, провинция Гуандун |
1 |
23 |
600.0 |
NaN |
2 |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
3 |
21 |
NaN |
Район Дунчэн, Пекин |
4 |
25 |
610.0 |
Район Байюнь, город Гуанчжоу, провинция Гуандун |
5 |
21 |
580.0 |
Район Цзянся, город Ухань, провинция Хубэй |
6 |
24 |
634.0 |
Район Лунхуа, город Шэньчжэнь, провинция Гуандун |
# 8、部分行,age及其后面的全部列
# 谨记:包含起止位置,这是和python切片不同的地方
df19 = df.loc[1:3,"age":]
df19
|
age |
score |
address |
1 |
23 |
600.0 |
NaN |
2 |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
3 |
21 |
NaN |
Район Дунчэн, Пекин |
# 9、针对非数值型行索引的取数
df20 = df0.loc["语文"]
df20
小明 101
小红 102
小孙 140
Name: 语文, dtype: int64
# 10、注意两个方括号取出的是DataFrame数据,单个括号是Series型数据
df0.loc[["语文"]]
|
Сяо Мин |
немного красный |
маленькое солнышко |
язык |
101 |
102 |
140 |
df0.loc[["语文","英语"]]
|
Сяо Мин |
немного красный |
маленькое солнышко |
язык |
101 |
102 |
140 |
английский |
87 |
128 |
117 |
# 11、取出部分行和列数据
df21 = df0.loc[["语文","英语"],"小明"]
df21
语文 101
英语 87
Name: 小明, dtype: int64
df0.loc[["语文","英语"],["小明","小孙"]]
|
Сяо Мин |
маленькое солнышко |
язык |
101 |
140 |
английский |
87 |
117 |
# 12、直接使用行索引名来取数
df0.loc[["语文","英语"]]
|
Сяо Мин |
немного красный |
маленькое солнышко |
язык |
101 |
102 |
140 |
английский |
87 |
128 |
117 |
Сравните два
df.loc[[1,2]]
|
name |
sex |
age |
score |
address |
1 |
маленький король |
Женский |
23 |
600.0 |
NaN |
2 |
Чжан Фэй |
Женский |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
df.iloc[[1,2]]
|
name |
sex |
age |
score |
address |
1 |
маленький король |
Женский |
23 |
600.0 |
NaN |
2 |
Чжан Фэй |
Женский |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
# 指定我们需要的列属性名
df.loc[[1,2],["name","score"]]
|
name |
score |
1 |
маленький король |
600.0 |
2 |
Чжан Фэй |
550.0 |
# 取出第1和2行,0和3列
df.iloc[[1,2],np.r_[0,3]]
|
name |
score |
1 |
маленький король |
600.0 |
2 |
Чжан Фэй |
550.0 |
в и иат
at
Функция at похожа на loc, но функция at извлекает только значение.
df22 = df.at[4,"sex"]
df22
'女'
df.at[2,"name"]
'张菲'
df0
|
Сяо Мин |
немного красный |
маленькое солнышко |
язык |
101 |
102 |
140 |
математика |
114 |
95 |
67 |
английский |
87 |
128 |
117 |
# 同时指定索引和列名
df23 = df0.at['语文','小孙']
df23
140
# at、loc连用
df.loc[1].at['age']
23
df
|
name |
sex |
age |
score |
address |
0 |
Сяо Мин |
мужчина |
20 |
NaN |
Район Наньшань, город Шэньчжэнь, провинция Гуандун |
1 |
маленький король |
Женский |
23 |
600.0 |
NaN |
2 |
Чжан Фэй |
Женский |
18 |
550.0 |
Район Юйхуа, город Чанша, провинция Хунань |
3 |
Гуань Юй |
мужчина |
21 |
NaN |
Район Дунчэн, Пекин |
4 |
Сунь Сяосяо |
Женский |
25 |
610.0 |
Район Байюнь, город Гуанчжоу, провинция Гуандун |
5 |
Ван Цзянго |
мужчина |
21 |
580.0 |
Район Цзянся, город Ухань, провинция Хубэй |
6 |
Лю Бэй |
Женский |
24 |
634.0 |
Район Лунхуа, город Шэньчжэнь, провинция Гуандун |
# 列名为name的第4个元素
df.name.at[4]
'孙小小'
iat
Как и iloc, поддерживает операции только с числовыми индексами.
df24 = df.iat[2,4]
df24
'湖南省长沙市雨花区'
df.loc[2].iat[4]
'湖南省长沙市雨花区'
df.iloc[2].iat[4]
'湖南省长沙市雨花区'
каждый и все
- any: True, если хотя бы один из них True
- all: все результаты должны быть истинными, чтобы быть верными
Когда входящая ось = 1, запрос будет выполняться по строке; ось = 0 означает запрос по столбцу
Сравнение данных в сериях
# 两个False通过any结果为False
pd.Series([False, False]).any() # False
pd.Series([True, False]).any() # True
pd.Series([True, False]).all() # False
# any:是否跳过空值
pd.Series([np.nan]).any() # False
pd.Series([np.nan]).any(skipna=False) # True
# all:是否跳过空值
pd.Series([np.nan]).all() # True
pd.Series([np.nan]).all(skipna=False) #True
Сравнение в DataFrame
df0
|
Сяо Мин |
немного красный |
маленькое солнышко |
язык |
101 |
102 |
140 |
математика |
114 |
95 |
67 |
английский |
87 |
128 |
117 |
# 1、取出待查询的数据
df0.loc[:,["小明","小红"]]
|
Сяо Мин |
немного красный |
язык |
101 |
102 |
математика |
114 |
95 |
английский |
87 |
128 |
# 2、进行比较
df0.loc[:,["小明","小红"]] >= 100
|
Сяо Мин |
немного красный |
язык |
True |
True |
математика |
True |
False |
английский |
False |
True |
any
# 3、使用any函数筛选
df0[(df0.loc[:,["小明","小红"]] >= 100).any(1)]
all
Только язык может удовлетворить 3 человек одновременно, и все они больше 100 человек.
# 4、使用all函数筛选:只有语文满足3个人同时大于100
df0[(df0.loc[:,["小明","小红"]] >= 100).all(1)]
Суммировать
В этой статье рассказывается об использовании 3 пар функций в pandas через смоделированные данные. Среди них функции loc и iloc являются очень распространенными и практичными функциями, и они часто используются сами по себе. На данный момент часть фильтрации данных в pandas была полностью представлена. Конечно, представленные методы - это только часть богатых навыков счета панд.Есть много функций и методов, которые читатели должны изучить и освоить самостоятельно.Я надеюсь, что представленные методы будут полезны всем.