pandas處理excel的常用方法技巧(上)


1. 導庫

import pandas as pd

2. 讀取excel文件

這里要注意的就是第二個參數header如果不設置,pandas會默認把excel的第一行當作columns,header=None的時候pandas會為我們新生成從0開始的數字做columns, 我們可以通過header=1把第二行當作columns;第三個參數index_col是表示用哪一列做index的,如果不設置的話,pandas會默認生成一串從0開始的數字當作index,我們可以設置指定列來當作index,例如index_col=“id”.
如果出現數據沒在excel表格的左上角,可以使用skiprows參數來略過行,也可以使用usecols="F:H"來決定從第幾列開始讀取
可以使用sheet_name=參數決定讀取第幾個sheet

df = pd.read_excel('d:/用戶信息.xlsx', header=1, index_col='id')

df = pd.read_excee('d:/books.xlsx', skiprows=3, usecols="G:L")

3. 讀取一個對象的頭和尾

我們可以通過head()方法和tail()方法來讀取頭和尾,不設置參數默認讀5行,可以設置int類型參數來決定我們讀多少行。

df.head()  # 讀前五行
df.head(7)  # 讀前七行

df.tail()  # 讀后五行
df.tail(3)  # 讀后三行

4. 為對象設置columns

通過修改對象的columns屬性就相當於重新為對象設置了columns

df.columns = ['訂單id', '用戶id', '訂單狀態']

5. 為對象設置index

我們可以通過set_index()方法設置index, 如我們可以把訂單id這一列設置為index,但是要注意的是設置之后,訂單id將不再出現在df.columns屬性中了,會變成index的name;第二個參數inplace就地修改,可以設置為True和False.

df.set_index('訂單id', inplace=True)

5. 寫入文件保存

可以通過to_excel()方法保存到本地.

df.to_excel('d:/user_id.xlsx')

6. pandas中表格的行和列

在一個二維表格中,一行或者一列我們都可以用Series對象來表示。一個Series是當作行還是當作列,完全是由我們加入的方法決定的。

7. Series簡介和Series屬性

Series的結構和字典的結構很相似,不過在Series中不叫keys了,叫index;
Series的屬性有index, name, value, data(快要移除了), 還有其他不常用屬性可以到pycharm中一個點全出來了.

8. Series創建

創建一個空的Series:

s1 = pd.Series()

從字典生成,字典的key是這里的index

d = {'x':100, 'y':200, 'z':300}
s2 = pd.Series(d)

從列表生成,這時候需要兩個列表, 一個用作value,一個用作index

lst1 = [100, 200, 300]  # 當作value
lst2 = ['a', 'b', 'c']  # 當作index
s3 = pd.Series(lst1, index=lst2)

9. 用Series來構造DataFrame

相當於我們用一行一行或者一列一列元素,拼出一個excel表格;
首先看一下用三個Series對象構造出一個Excel表格的三列,可以用Series的name屬性當作列名, index當作每一行的行號;如果index不相同,取index的並集,沒有數值的地方給個NaN

s1 = pd.Series([1, 2, 3], index=[1, 2, 3], name='A')
s1 = pd.Series([10, 20, 30], index=[1, 2, 3], name='B')
s1 = pd.Series([100, 200 300], index=[1, 2, 3], name='C')

df = pd.DataFrame({s1.name:s1, s2.name:s2, s3.name:s3})  # 用的最多的方式, 一列一列的

如果不以字典方式構造excel表格的話,直接只用Series序列構造,會出現以Series的name當作行號,一行一行的生成:

df = pd.DataFrame(s1, s2, s3) # 一行一行的

10. 修改一個值或者修改n個值(自動填充)

先找到Series再改Series中的元素:

import pandas as pd
from datetime import date, timedelta
def add_month():
    yd = md // 12
    m = d.month + md % 12
    if m != 12
    yd += m // 12
    m = m % 12
    return date(d.year+yd, m, d.day)
books = pd.read_excel("d:/book.xlsx", skiprows=3, usecols="C:F", index_col=None,
                        dtype={'name':str, 'id':str, 'date':str})
for i in books.index:
    if type(books['name'].at[i]) != int:
        books['name'].at[i]
        books['id'] = 'yes' if i & 1 else 'No'
        books['date'].at[i] = add_month(start, i)
books.set_index("id")

第二種方法是直接在DataFrame中改對應的單元格

for i in books.index:
    books.at[i, 'date'] = 12

11. 函數填充

需求,在excel表格中,我們可以根據前面幾列的數據按照某種函數進行計算,再添加到指定表格中,這里用程序完成:

books = pd.read_excel('d:/bookss.xlsx', index_col='ID')
books["Price"] = books["ListPrice"] * books["Discount"]
print(books)

第二種情況就是DataFrame中的每一列Series有一個apply(function)方法,給function傳入一個函數可以對這一Series進行函數處理:

books = pd.read_excel('d:/bookss.xlsx', index_col='ID')
books["ListPrice"] = books["ListPrice"].apply(lambda x: x+2)

12. 給數據排序

使用DataFrame的sort_values()方法進行排序,按照by參數排序, inplace就地, ascending=False是降序;
如果我們想要先按照某列排序,再按某列排序,by后面可以跟一個列表,ascending也可以給個列表,兩種順序;

products = pd.read_excel('d:/List.xlsx, index_col='ID')
products.sort_values(by='Price', inplace=True, ascending=False)

products.sort_values(by=['Worthy', 'Price'], inplace=True, ascending=[True, False])

13. 數據篩選、過濾

很多時候,我們想要展現的數據,是全體的數據,我們只需要展示其中的一部分
使用loc屬性

loc屬性介紹

# DataFrame對象有loc屬性,loc屬性可以通過bool值返回從DataFrame對象中篩選出來的DataFrame對象
# 先創建一個DataFrame對象
lst1 = pd.Series(["tom", "jerry", "jacky", "wayne", "justin"])
lst2 = pd.Series([35, 24, 16, 45, 26])
lst3 = pd.Series([98, 95, 86, 73, 99])

students = pd.DataFrame({"name":lst1, "age":lst2, "grade":lst3})
print(students)
     name  age  grade
0     tom   35     98
1   jerry   24     95
2   jacky   16     86
3   wayne   45     73
4  justin   26     99

# 定義兩個函數來判斷成績是否是優秀,年齡是否年輕, 返回的都是bool值
def young_age(age):
    return age < 30

def good_grade(grade):
    return grade > 85
    
# 通過DataFrame對象的apply方法,對students的元素進行判斷取bool值,為了不污染原數據,可以使用拷貝
cp = students.copy()
cp["grade"] = cp["grade"].apply(good_grade)
cp["age"] = cp["age"].apply(young_age)
print(cp)
     name    age  grade
0     tom  False   True
1   jerry   True   True
2   jacky   True   True
3   wayne  False  False
4  justin   True   True
# 這時候我們可以清晰的看到age和grade都已經被判斷為了是否是young,是否是good

# 有了這一步,下一步我們就可以用bool在loc屬性中進行篩選元素了
students = students.loc[students["age"].apply(young_age)].loc[students["grade"].apply(good_grade)]]
這里就清晰的看出來我們兩次使用loc屬性對數據進行清洗,然后重新賦值給了students變量
print(students)
     name  age  grade
1   jerry   24     95
2   jacky   16     86
4  justin   26     99
# 這里就得到了清洗后的數據,即我們要展示的數據,既年輕,成績又優秀的同學

下面這個同理, 不過students[“age”]和students[“grade”]還可以換成students.age和students.grade來訪問對應的列Series:

import pandas as pd

def age_18_to_30(age):
    return 18 <= age < 30   # 判斷一個年齡是否是18到30之間
    
def level_a(grade):
    return 85 <= grade <= 100  # 判斷一個成績是否是優秀

students = pd.read_excel("d:/students.xlsx", index_col="ID")

students = students.loc[ students["Age"].apply(age_to_30) ].loc[ students["score"].apply(level_a) ]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM