Двумерные данные, контейнер Series, как индекс строки, так и индекс столбца
1. Создайте фрейм данных
1.1 Создать DataFrame из списка
Необходимо указать данные, строку индекса, столбец столбцов
Укажите данные и индекс/столбцы как тип списка или np.arange
df1 = pd.DataFrame(data=[[1, 2, 3], [11, 12, 13]], index=['r_1', 'r_2'], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(data=[[1], [11]], index=['r_1', 'r_2'], columns=['A'])
df3 = pd.DataFrame(data=np.arange(12).reshape(3, 4), index=list("abc"), columns=list("ABCD"))
A B C
r_1 1 2 3 r_2 11 12 13
А р_1 1 р_2 11
A B C D a 0 1 2 3 b 4 5 6 7 c 8 9 10 11
1.2 Создайте DataFrame через словарь
1.2.1 Метод 1: передать один словарь, обратите внимание, что это должен быть ключ с несколькими значениями (при единственном значении также необходимо добавить [])
dict = {"name": ["jack", "HanMeimei"], "age": ["100", "100"]}
# dict = {"name": "jack", "age": "100"}#这样写是会报错的
# dict = {"name":["jack"], "age": ["100"]}#如果是单值,必须加[]
df3 = pd.DataFrame(dict, index=list("ab"))
age age1 name
a 100.0 NaN MaYun1 b 100.0 NaN MaYun2 c NaN 100.0 MaYun3
1.2.2 Способ 2: передать список словарей, каждый словарь представляет собой строку данных, а недостающие столбцы будут дополнены nan
dict = [{"name": "MaYun1", "age": 100}, {"name": "MaYun2", "age": 100}, {"name": "MaYun3", "age1": 100}]
# dict = {"name": "jack", "age": "100"}
df4 = pd.DataFrame(dict, index=list("abc"))
2. Основные свойства DataFrame
dict = {"name": ["jack", "HanMeimei", "Lucy"], "age": ["100", "90","98"], "salary": [30000, 50000, 999000]}
df5 = pd.DataFrame(dict)
print(df5)
print(df5.head(1))
print(df5.tail(1))
print(df5.info())
print(df5.index)
print(df5.columns)
print(df5.values)
print(df5.describe())
3. Все данные сортируются по указанному столбцу
df5 = df5.sort_values(by='salary', ascending=True)
print(df5)
4. Простая строка DataFrame, срез столбца
dict = {"name": ["jack", "HanMeimei", "Lucy","Mr Green", "Mrs Han", "Lily"],
"age": [100, 90,98,90,100,30], "salary": [30000, 50000, 999000,90000,80000,75000]}
df6 = pd.DataFrame(dict)
print(df6)
# 取出前五行
print(df6[0:5])
# 取出name列
print(df6["name"])
# 取出前三行的name列
print(df6[0:3]["name"])
5. Локальный срез строки и столбца
5.1 Многословная и хлопотная версия + можете не обращать внимания, просто смотрите 5.2
5.1.1 Синтез
dict = {"name": ["jack", "HanMeimei", "Lucy", "Mr Green", "Mrs Han", "Lily"],
"age": [100, 90, 98, 90, 100, 30], "salary": [30000, 50000, 999000, 90000, 80000, 75000]}
df7 = pd.DataFrame(dict, index=list("abcdef"))
print(df7)
# 取出行标签为'a',列标签为'name'的元素
print(df7.loc['a', 'name'])
# 取出行标签为'f',列标签为['name','age']的元素
print(df7.loc['f', ['name', 'age']])
# 取出行标签为['c','f'],列标签为['name','age']的元素
print(df7.loc[['c', 'f'], ['name', 'age']])
# 切片+单选合并使用:取出行标签为 (切片'a':'e'),列标签为['name','age']的元素
# 注意切片闭合性
print(df7.loc['a':'e', ['name', 'age']])
# 切片使用:取出行标签为 (切片'a':'e'),列标签为['name','age']的元素
print(df7.loc['a':'e', 'age':'salary'])
5.1.2 Выборка одной строки — выборка всех данных в строке «а»
#以下的两种方式均可
df7.loc['a',:]
df7.loc['c']
name Lucy age 98 salary 999000
5.1.3 Извлечь несколько непоследовательных строк — извлечь все данные с метками строк «a», «c»
df7.loc[['a','c']]#注意嵌套[]
5.1.4 Вырезание нескольких последовательных строк
df7['a':'c']
5.1.5 Извлечение одного столбца — получение всех данных с меткой столбца «имя».
#以下的两种方式均可
print(df7.loc[:,'name'])
print(df7['name'])
a jack b HanMeimei c Lucy d Mr Green e Mrs Han f Lily
5.1.6 Извлечение прерывистых столбцов. Извлечение всех данных с метками строк «имя», «возраст».
df7.loc[:,['name','age']]
df7[['name', 'age']]
5.2 * Просто запомните следующее, будет сложно запомнить слишком много
Основной формат:
df7.loc[行,列]
Если вы берете последовательные строки или столбцы - используйте срезы:
При выборке непоследовательных строк или столбцов используйте список [ ]
где срезы и списки могут быть смешаны
Составлять список:
5.5.1 Последовательные строки и столбцы
df7.loc['a':'c','name':'age']
注意:包含了b行,因为是行切片
> name age
a jack 100
b HanMeimei 90
c Lucy 98
5.5.2 Непрерывные несколько строк + непрерывные несколько столбцов
df7.loc[['a','c'],'name':'salary']
注意:行是不连续选择,只是a和c
列是连续切片,包含了中间的age
> name age salary
a jack 100 30000
c Lucy 98 999000
5.5.3 Непрерывные несколько строк + прерывистые несколько столбцов
df7.loc[['a','c'],['name','salary']]
注意:行是不连续选择,只是a和c
列也是不连续选择,只是name和salary
> name salary
a jack 30000
c Lucy 999000
5.5.4 Все строки + несколько непоследовательных столбцов (то же самое для всех столбцов)
df7.loc[:,['name','salary']]
注意:只要把行写个空切片就行 :
> name salary
a jack 30000
b HanMeimei 50000
c Lucy 999000
d Mr Green 90000
e Mrs Han 80000
f Lily 75000
5.5.5 Непрерывные несколько строк + один столбец (то же самое для одной строки)
df7.loc[['a','c'],'name']
注意:单列名没加[],结果是个Series
> a jack
c Lucy
Name: name, dtype: object
<class 'pandas.core.series.Series'>
df7.loc[['a','c'],['name']]
type(df7.loc[['a','c'],['name']])
注意:单列名加[],结果是个DataFrame
> name
a jack
c Lucy
<class 'pandas.core.frame.DataFrame'>
6. iloc срез строки и столбца
Просто берите значение по позиции, принцип тот же, что и у loc
Только учтите, что слайсы не содержат последнее число, в отличие от loc
df7.iloc[[1,3],[0]]
> 取得不连续的行列
name
b HanMeimei
d Mr Green
df7.iloc[1:3,0:1]
> 没包含3的d ,没包含1的age
name
b HanMeimei
c Lucy
7. Назначение изменений данных
Вы можете использовать loc или iloc
df7.iloc[1:3,1:3]=99999999
print(df7)
> name age salary
a jack 100 30000
b HanMeimei 99999999 99999999
c Lucy 99999999 99999999
d Mr Green 90 90000
e Mrs Han 100 80000
f Lily 30 75000
8. Логическое индексирование
Давайте посмотрим пример вместе
создать фрейм данных
Score = {"姓名": ["张无忌", "赵敏", "小乔", "大乔", "杨玉环", "貂蝉", "西施", "王子", "姜子牙", "李白", "杜甫", "王伟","李晓雨"],
"语文": [78, 90, 87, 88, 56, 94, 92, 85, 93, 91, 59, 100,100],
"数学": [91, 59, 100, 75, 30, 95, 91, 59, 100, 10, 95, 85,100],
"英语": [91, 59, 100, 75, 30, 95, 10, 95, 85, 75, 30, 95,100]}
df_score = pd.DataFrame(Score)
print(df_score)
8.1 Удалите данные обо всех людях, чей балл по английскому языку превышает 90.
# 得到的是一个Series
loc_ = df_score.loc[:,"英语"] > 90
print(loc_)
print(type(loc_))# <class 'pandas.core.series.Series'>
# dataframe 布尔索引,会筛选出所有值为true的行
print(df_score[loc_])
# 也可以简写为
print(df_score[df_score.loc[:,"英语"]>90])
8.2 Удалите данные обо всех людях, чьи баллы по английскому языку ниже 90 (~)
Примечание: добавьте ~, чтобы отрицать
print(df_score[~(df_score.loc[:, "英语"] > 90)])
8.3 Удалите все данные с оценкой английского языка выше 90 и китайского языка выше 80.
print(df_score[(df_score.loc[:, "英语"] > 90)&(df_score.loc[:, "语文"] < 80)])
8.4 Скриншоты точек знаний
9. Строковые методы
# 创建一个dataframe
student = {"姓名": ["张无忌", "赵敏", "小乔", "大乔", "杨玉环", "貂蝉", "西施", "王子", "姜子牙", "李白", "杜甫", "王伟", "李晓雨"],
"语文": [78, 90, 87, 88, 56, 94, 92, 85, 93, 91, 59, 100, 100],
"数学": [91, 59, 100, 75, 30, 95, 91, 59, 100, 10, 95, 85, 100],
"英语": [91, 59, 100, 75, 30, 95, 10, 95, 85, 75, 30, 95, 100],
"班级": ["一年级3班", "一年级1班", "二年级3班", "二年级1班", "一年级13班", "三年级7班", "五年级3班", "四年级3班", "一年级5班", "一年级7班", "一年级4班",
"一年级9班", "一年级10班"],
}
df_student = pd.DataFrame(student)
print(df_student)
9.1 len — выбрать данные, длина строки которых больше 5 в столбце [Класс]
print(df_student[df_student["班级"].str.len() > 5])
9.2 заменить — изменить [Класс] в элементе столбца [Класс] на [Школьный класс]
# 注意等号右侧返回一个Series,要把它赋值给原DataFrame对应的列
df_student["班级"] = df_student["班级"].str.replace("一年级", "学校一年级")
print(df_student)
# 下面是取列的loc用法
df_student.loc[:,"班级"] = df_student.loc[:,"班级"].str.replace("一年级", "学校一年级")
9.3 содержит - отфильтровать данные, столбец [класс] которых содержит "школа" и "1"
print(df_student[
(df_student["班级"].str.contains("学校"))
&
(df_student["班级"].str.contains("1"))])
9.4 расщепление — перерезание струн.
9.5 get — печатает первый символ имени (фамилии) учащегося.
print((df_student["姓名"].str.get(0)))
9.6 Регулярное выражение сопоставления, чтобы найти данные, имя которых содержит «Wang | Li»
reg = '王|李'
print(df_student[df_student["姓名"].str.match(reg)])
9.7 Символ заполнения PAD *
# 注意width=10表示,现在的字符+要填充的*,一起计算宽度为10
# 两侧都加*,最后得到的字符串长度为10,不足用*添加(也可以不写side,直接使用center函数)
df_student["姓名"] = df_student["姓名"].str.pad(width=10, side='both', fillchar='*')
# 右侧都加—,最后得到的字符串长度为20,不足用-添加
df_student["姓名"] = df_student["姓名"].str.pad(width=20, side='right', fillchar='-')
print(df_student)
9.5 Скриншоты точек знаний
10. Добавьте новый столбец статистического общего балла, чтобы применить метод.
10.1 Прямое добавление
df_student["总分"] = df_student["语文"] + df_student["数学"] + df_student["英语"]
10.2 Используйте метод применения Series для обхода (примените проходы в функции, которая является более мощной)
df_student['总分'] = pd.Series(df_student.index.tolist()).apply(
lambda i: df_student.loc[i, "语文"] + df_student.loc[i, "数学"] + df_student.loc[i, "英语"])
# 1.为了使用Series的apply方法,根据DataFrame的Index生成一个Series,
pd.Series(df_student.index.tolist())
# 2.后面是一个lambda表达式,也可以定义函数传递进去(写函数就可以做很多处理了),见下例
# 让语文大于90的人,让他的语文成绩再加上1000分,然后求总分
def sum1(i):
if df_student.loc[i, "语文"] > 90:
df_student.loc[i, "语文"] = df_student.loc[i, "语文"] + 1000
return df_student.loc[i, "语文"] + df_student.loc[i, "数学"] + df_student.loc[i, "英语"]
df_student['总分'] = pd.Series(df_student.index.tolist()).apply(
lambda i: sum1(i))
11. Обработка отсутствующих данных
# 使用numpy生成一组随机整数(在0~100之间,形状为5行7列)
rand = np.random.randint(0, 100, (5, 7))
# 使用numpy上传的数据生成DataFrame
df = pd.DataFrame(rand, columns=list("ABCDEFG"))
# 定义一些NaN
df.loc[0:3, "A":"B"] = np.nan
print(df)
11.1 Определите, является ли это NaN
11.1.1 Оценка того, является ли весь df Nan или нет
# 是null吗
print(pd.isnull(df))
结果是:DataFrame
# 不是null吗
print(pd.notnull(df))
11.1.2 Оценка того, является ли указанный столбец df Nan или нет
# 打印A列里数据为NUll的数据
print(df[pd.isnull(df["A"])])
# 打印A列里数据不为NUll的数据
print(df[pd.notnull(df["A"])])
11.2 Удалить данные с помощью nan в df
# 不输入how参数,默认为any
# 只要有一个是NaN,就会删除该行
print(df.dropna(axis=0))
# 只有全部是NaN,才会删除该行
print(df.dropna(axis=0,how="all"))