刚刚使用Python学习进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~
Pandas是一个用于处理表格数据的Python模块(即带有行和列的表中的数据)
- 创建一个DataFrame
DataFrame是一个将数据存储为行和列的对象。您可以将DataFrame视为电子表格或SQL表格。您可以手动创建DataFrame,也可以使用CSV,Excel电子表格或SQL查询中的数据填充它。
DataFrames有行和列。每列都有一个名称,这是一个字符串。每行都有一个索引,它是一个整数。DataFrames可以包含许多不同的数据类型:字符串,整数,浮点数,元组等。
1.使用dictionary添加dataframe
# You can pass in a dictionary to DataFrame(). Each key is a column name and each value is a list of column values.
# The columns must all be the same length or you will get an error.
df1 = pd.DataFrame({
'name': ['John Smith', 'Jane Doe', 'Joe Schmo'],
'address': ['123 Main St.', '456 Maple Ave.', '789 Broadway'],
'age': [34, 28, 51]
})
-------------------------------------------------------------
address age name
123 Main St. 34 John Smith
456 Maple Ave. 28 Jane Doe
789 Broadway 51 Joe Schmo
# Note that the columns will appear in alphabetical order because dictionaries don’t have any inherent order for columns.
2. 使用 list of lists 添加dataframe
# you can pass in a list of lists, where each one represents a row of data.
# Use the keyword argument columns to pass a list of column names.
df2 = pd.DataFrame([
['John Smith', '123 Main St.', 34],
['Jane Doe', '456 Maple Ave.', 28],
['Joe Schmo', '789 Broadway', 51]
],
columns=['name', 'address', 'age'])
---------------------------------------------------------------
name address age
John Smith 123 Main St. 34
Jane Doe 456 Maple Ave. 28
Joe Schmo 789 Broadway 51
# we were able to control the ordering of the columns because we used lists.
- 从另一个文件加载数据
CSV文件纯文本电子表格格式。可以在很多地方找到CSV:
- Online datasets 在线数据集
- 从Excel或Google表格导出
- 从SQL导出
CSV的第一行包含列标题。所有后续行都包含值。每个列标题和每个变量用逗号分隔,如下所示:
xxxx.csv
column1,column2,column3
value1,value2,value3
1. 如果存在一个CSV文件,可以使用.read_csv()将文件下载到pandas的dataframe中
import pandas as pd
df=pd.read_csv('sample.csv')
print(df)
----------------------------------------------------------
City Population Median Age
0 Maplewood 100000 40
1 Wayne 350000 33
2 Forrest Hills 300000 35
3 Paramus 400000 55
4 Hackensack 290000 39
- 选择表的某些行或列
如果它是一个小型DataFrame,您可以通过键入来显示它print(df)。
如果它是一个更大的DataFrame,那么能够检查一些项目而不必查看整个DataFrame是有帮助的。
1. 查看列信息
# .info() gives some statistics for each column.
import pandas as pd
df = pd.read_csv('imdb.csv')
print(df.info())
-------------------------------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 220 entries, 0 to 219
Data columns (total 5 columns):
id 220 non-null int64
name 220 non-null object
genre 220 non-null object
year 220 non-null int64
imdb_rating 220 non-null float64
dtypes: float64(1), int64(2), object(2)
memory usage: 8.7+ KB
None
2. 查看行
# .head() gives the first 5 rows of a DataFrame.
# If you want to see more rows, you can pass in the positional argument .head(n)
import pandas as pd
df = pd.read_csv('imdb.csv')
print(df.head())
-------------------------------------------------------------
id name genre year imdb_rating
0 1 Avatar action 2009 7.9
1 2 Jurassic World action 2015 7.3
2 3 The Avengers action 2012 8.1
3 4 The Dark Knight action 2008 9.0
4 5 Star Wars: Episode I - The Phantom Menace action 1999 6.6
** 注意⚠️:.head()和.info()函数是,dataframe数据类型的方法,注意是谁调用该方法
3. 选择某一列的数据,返回Series
例如,当你需要某一列数值来计算其均值并绘制直方图时,我们只需要选择感兴趣的数据
# 有两种方法可以使用:
1. dataframe类型的文件名['列名']
2. dataframe类型的文件名.列名
import pandas as pd
df = pd.DataFrame([
['January', 100, 100, 23, 100],
['February', 51, 45, 145, 45],
['March', 81, 96, 65, 96],
['April', 80, 80, 54, 180],
['May', 51, 54, 54, 154],
['June', 112, 109, 79, 129]],
columns=['month', 'clinic_east',
'clinic_north', 'clinic_south',
'clinic_west']
)
clinic_north=df.clinic_north 或者 clinic_north=df['clinic_north']
print(type(clinic_north))
print(type(df))
---------------------------------------------------------
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
4. 选择两列或多列
# select two or more columns from a DataFrame, we use a list of the column names.
# !!!!!!是两层[] dataframe类型的文件名[['列名A','列名B']]
# 如上代码
clinic_north_south=df[['clinic_north','clinic_south']]
print(type(clinic_north_south))
-------------------------------------------------------
<class 'pandas.core.frame.DataFrame'>
** 注意⚠️:Make sure that you have a double set of brackets ([[]])
5. 选择一行数据,返回Series
# 使用 dataframe类型的文件名.iloc[index]方法,其中index从0开始
# 如上代码
march=df.iloc[2]
print(type(march))
-------------------------------------------------------------
<class 'pandas.core.series.Series'>
6.选择很多行数据
# 和列表等数据类型的索引使用方法一致:
1. dataframe类型的文件名.iloc[3:7] 选择包括第3行但是不包括第7行的数据
2. dataframe类型的文件名.iloc[:7] 选择头7行的数据
3. dataframe类型的文件名.iloc[-3:] 选择后3行的数据
# 如上代码
april_may_june=df.iloc[3:6]
print(april_may_june)
--------------------------------------------------------------
month clinic_east clinic_north clinic_south clinic_west
3 April 80 80 54 180
4 May 51 54 54 154
5 June 112 109 79 129
# 使用 dataframe类型的文件名.列名.isin(['列名A','列名B'])方法
# 注意⚠️:入参的数据类型要求 a list of values
# 如上代码
january_february_march=df[df.month.isin(['January','February','March'])]
print(january_february_march)
-------------------------------------------------------------
month clinic_east clinic_north clinic_south clinic_west
0 January 100 100 23 100
1 February 51 45 145 45
2 March 81 96 65 96
7. 使用逻辑判断选择所需数据,无论多少行返回DataFrame
# 使用列名挑选所需数据,其中df是dataframe类型的文件名;age是文件中的某列
1. df[df.age == 30]
2. df[df.age > 30]
3. df[df.age < 30]
4. df[df.name != 'Clara Oswald']
5. df[(df.age < 30) | (df.name == 'Martha Jones')]
6. df[(df.age < 30) & (df.name == 'Martha Jones')]
# 如上代码
not_january=df[df.month!='January']
print(january)
march_clinic_east=df[(df.month=='March') |(df.clinic_east>81)]
print(march_clinic_east)
-------------------------------------------------------------
month clinic_east clinic_north clinic_south clinic_west
1 February 51 45 145 45
2 March 81 96 65 96
3 April 80 80 54 180
4 May 51 54 54 154
5 June 112 109 79 129
month clinic_east clinic_north clinic_south clinic_west
0 January 100 100 23 100
2 March 81 96 65 96
5 June 112 109 79 129
8. 设定索引
当我们使用逻辑选择DataFrame的子集时,我们最终得到非连续索引,会导致新的DataFrame难以使用.iloc[]:
- We can fix this using the method.reset_index()
- If we run the command df.reset_index(drop=True), we get a new DataFrame with new index
- If we use the keyword inplace=True we can just modify our existing DataFrame
** 区别iloc[]和loc[]函数
.loc[k]是读取dataframe中index为k的那一行
.iloc[k]是读取dataframe中的第k行
例如:
df3.loc[k]中,k只能取1,3,5;
df3.iloc[k]中,k只能取0,1,2