二維數據,Series容器,既有行索引,又有列索引python
![]()
須要指定 data,index 行,columns 列正則表達式
指定data和index/columns是list類型或者 np.arangebash
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 Capp
r_1 1 2 3 r_2 11 12 13dom
A r_1 1 r_2 11ide
A B C D a 0 1 2 3 b 4 5 6 7 c 8 9 10 11函數
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 nameui
a 100.0 NaN MaYun1 b 100.0 NaN MaYun2 c NaN 100.0 MaYun3spa
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"))
複製代碼
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())
複製代碼
df5 = df5.sort_values(by='salary', ascending=True)
print(df5)
複製代碼
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"])
複製代碼
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'])
複製代碼
#如下的兩種方式都可
df7.loc['a',:]
df7.loc['c']
複製代碼
name Lucy age 98 salary 9990003d
df7.loc[['a','c']]#注意嵌套[]
複製代碼
df7['a':'c']
複製代碼
#如下的兩種方式都可
print(df7.loc[:,'name'])
print(df7['name'])
複製代碼
a jack b HanMeimei c Lucy d Mr Green e Mrs Han f Lily
df7.loc[:,['name','age']]
df7[['name', 'age']]
複製代碼
基本格式爲:
df7.loc[行,列]
複製代碼
若是取連續的行或者列---使用切片 :
若是取出來不連續的行或列—使用列表 [ ]
其中 切片和列表能夠混合使用
舉列:
df7.loc['a':'c','name':'age']
注意:包含了b行,由於是行切片
> name age
a jack 100
b HanMeimei 90
c Lucy 98
複製代碼
df7.loc[['a','c'],'name':'salary']
注意:行是不連續選擇,只是a和c
列是連續切片,包含了中間的age
> name age salary
a jack 100 30000
c Lucy 98 999000
複製代碼
df7.loc[['a','c'],['name','salary']]
注意:行是不連續選擇,只是a和c
列也是不連續選擇,只是name和salary
> name salary
a jack 30000
c Lucy 999000
複製代碼
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
複製代碼
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'>
複製代碼
只是經過位置取值,原理與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
複製代碼
可使用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
複製代碼
一塊兒看個例子吧
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)
複製代碼
# 獲得的是一個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])
複製代碼
注意:加 ~ 取反
print(df_score[~(df_score.loc[:, "英語"] > 90)])
複製代碼
print(df_score[(df_score.loc[:, "英語"] > 90)&(df_score.loc[:, "語文"] < 80)])
複製代碼
# 建立一個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)
複製代碼
print(df_student[df_student["班級"].str.len() > 5])
複製代碼
# 注意等號右側返回一個Series,要把它賦值給原DataFrame對應的列
df_student["班級"] = df_student["班級"].str.replace("一年級", "學校一年級")
print(df_student)
# 下面是取列的loc用法
df_student.loc[:,"班級"] = df_student.loc[:,"班級"].str.replace("一年級", "學校一年級")
複製代碼
print(df_student[
(df_student["班級"].str.contains("學校"))
&
(df_student["班級"].str.contains("1"))])
複製代碼
print((df_student["姓名"].str.get(0)))
複製代碼
reg = '王|李'
print(df_student[df_student["姓名"].str.match(reg)])
複製代碼
# 注意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)
複製代碼
df_student["總分"] = df_student["語文"] + df_student["數學"] + df_student["英語"]
複製代碼
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))
複製代碼
# 使用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)
複製代碼
# 是null嗎
print(pd.isnull(df))
結果是:DataFrame
複製代碼
# 不是null嗎
print(pd.notnull(df))
複製代碼
# 打印A列裏數據爲NUll的數據
print(df[pd.isnull(df["A"])])
複製代碼
# 打印A列裏數據不爲NUll的數據
print(df[pd.notnull(df["A"])])
複製代碼
# 不輸入how參數,默認爲any
# 只要有一個是NaN,就會刪除該行
print(df.dropna(axis=0))
複製代碼
# 只有所有是NaN,纔會刪除該行
print(df.dropna(axis=0,how="all"))
複製代碼