DataFrame基本操作


這些操作在網上都可以百度得到,為了便於記憶自己再根據理解總結在一起。---------勵志做一個優雅的網上搬運工

1.建立dataframe

(1)Dict to Dataframe

df = pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
df
      data1     data2 key1 key2
0 -0.484486 -1.404184    a  one
1 -1.541437  0.549591    a  two
2 -0.015287 -1.589111    b  one
3 -0.069614 -0.513824    b  two
4 -0.704788  0.395147    a  one

(2)Series to Dataframe

df2=pd.DataFrame(np.arange(16).reshape((4,4)),index=['one','two','three','four'],columns=['a','b','c','d'])
df2
        a   b   c   d
one     0   1   2   3
two     4   5   6   7
three   8   9  10  11
four   12  13  14  15

(3)pd.read_csv()  ; pd.to_csv();

         pd.read_excel() ; pd.to_excel()

(4)建立一個新的空的dataframe 

df_empty = pd.DataFrame(columns=['A', 'B', 'C', 'D'])  

列表生成器

[x for x in range(0,5)]
[0, 1, 2, 3, 4]

 

2.dataframe基本操作

   (1)邏輯運算取行數:df[df['data1']>0]

   (2)規則運算取行數:

df2.loc[[2]]
      data1     data2 key1 key2
2  0.025434  0.119642    b  one
df2.iloc[[2]]
      data1     data2 key1 key2
2  0.025434  0.119642    b  one

  一個是按照index的序值,一個是按照index具體值

取前兩行:df[:,2]

(3)取指定的幾列

df = df[0:(len(df) - 1)] # 取df的前n-1行
取某兩列:df[[column1,column2]]
不指定列名取前四百列:df.iloc[:,0:400]

(4)取滿足條件的幾行

yy=data[(data['Ch']==8027)& (data['PlaceNo']==6)] 

df.loc[(df['AxleNo'] == 5) & (df['PlaceNo'] == 1) & (df['ResultMark'].isin([4,196,1028, 16388])), 'Alarm'] = 7 # 修改滿足條件行的

(5)按列拼接

https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/3-6-pd-concat/

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
          keys=None, levels=None, names=None, verify_integrity=False,
          copy=True)
pd.concat([df2,df2],axis=0)

objs:待合並的對象集合,可以是Serice,Dataframe

axis:{0,1,...}合並方向,默認為0,表示縱向,1表示橫向

join:{inner,outer}:合並方式,默認為outer,表示並集,inner表示交集

join_axes:按哪些對象的索引保存

ignore_index:{False,True},是否忽略原index,默認為不忽略

keys:為原始dataframe添加一個鍵,默認為無

 

ndarray的拼接,np.vstack((a,b));

                           np.hstack((a,b))

merge方法同樣可實現,merge(df1,df2),沒有指定連接列名默認將重復的列當作鍵

                                       merge(df1,df2,on=['key1','key2'])

                                      merge(df1,df2,rigth_on=,left_on=)當列名不相同時同樣可以進行合並

刪除重復的行

         df.drop_duplicates()      #刪除所有列完全重合的行

         df.drop_duplicates(['key1','key2'])    #刪除列1和列2重復的行

(6)按行拼接

result = df1.append(df2)

(7)修改索引

# inplace=Ture,在DataFrame上修改數據,而不是返回一個新的DataFrame
df1.reindex(['a','b','c','d','e'],  inplace=Ture)
修改列的排列順序
df1.reindex(columns=columns)

 x=x.reset_index() #將索引從新排列,但是會自動生成原來索引內容的index一列

3.groupby

(1)按照關鍵字分類,如果不使用mean().sum()函數的話,是一個group類型的數據

df2 = pd.DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],'data1':np.random.randn(5),'data2':np.random.randn(5)})
df2.groupby('key1').mean() data1 data2 key1 a 0.067198 0.650162 b 0.040813 0.126698 df2.groupby(['key1','key2']).mean() data1 data2 key1 key2 a one 0.373335 0.944841 two -0.545078 0.060804 b one 0.025434 0.119642 two 0.056192 0.133754

    補上df2

df2
      data1     data2 key1 key2
0 -0.511381  0.967094    a  one
1 -0.545078  0.060804    a  two
2  0.025434  0.119642    b  one
3  0.056192  0.133754    b  two
4  1.258052  0.922588    a  one

(2)對group數據再進行函數操縱apply(),agg()

        apply()應用所有數據

df2.groupby('key1').apply(np.mean)
         data1     data2
key1                    
a     0.067198  0.650162
b     0.040813  0.126698

    agg()應用某一列

group2=df2.groupby('key1')
group2
<pandas.core.groupby.DataFrameGroupBy object at 0x000001C6A964D518>
group2['data1'].agg('mean')  
key1
a    0.067198
b    0.040813

3.組合合並

(1)dataframe中其中兩列按照一定格式合並並生成新的一列

 df['經緯度']=df[['經度','緯度']].apply(lambda x:"{:.3f},{:.3f}".format(*x),axis=1)

Temp_data['軸位']=Temp_data['軸號'].map(str)+Temp_data['位號'].map(str)

(2)兩個dataframe表通過字段進行匹配組合成新表

1.merge方法

    pandas.merge(df1,df2,on=['key1','key2'],how=‘inner’)  

    how有inner、outer、left和right四個選項,分別表示並集,交集,按左連接和按右鏈接,默認為inner

2.combin方法

3.join方法

4.concat方法

pandas.concat([df1,df2,df3])是默認在縱向堆疊,列數不會增加。

pandas.concat([df1,df2,df3],axis=1,join='inner')會把每個DataFrame的列放在一起,按index識別

4.pivot_table 透視表

pd.pivot_table(df2, index='key1', columns='key2')  
         data1               data2          
key2       one       two       one       two
key1                                        
a     0.373335 -0.545078  0.944841  0.060804
b     0.025434  0.056192  0.119642  0.133754

 

df2.pivot_table(['data1'], index='key1',columns='key2')  
         data1          
key2       one       two
key1                    
a     0.373335 -0.545078
b     0.025434  0.056192

5.其他

(1)編碼

系統自動編碼:y = np.array(pd.Categorical(data['quality']).codes)

自己指定映射:data['category'] = data['quality'].map({"輕度污染":1,"中度污染":2})

(2)替換

c = df['AreaId'].replace(-1, 0) 將AreaId一列中-1的數替換成0
c = df['AreaId'].replace([-1,2,4,8], 0) 將AreaId一列中某些數據替換成0

(3)更改列名字

df = df.rename(columns={'DeviceName_濕度_DataValue_Mean_Mean': '濕度'})
(4)排序
df.sort_index(inplace=True) #將index排序
df=df.sort_index(by='timepoint') # index后續會被values替代,這兩行都是對dataframe中某一列進行排序
df=df.sort_values(by='timepoint')
(5)更改列的數據類型
修改整個數據框類型:df=pd.DataFrame(df,dtype='float').replace(0,np.nan).mean(1)
mean(1)是求行平均,

(6)其他地方收集到的神操作

if df['實發工資']>10000:
    df['實發工資']=df['應發工資']+20000

df['實發工資'] = df['應發工資'].applay(lambda x:x+20000 if x>10000 else x)

(7)根據列的值從DataFrame中選擇行

要選擇列的值等於某個值"some_value"的行,請使用==

df.loc[df['column_name'] == some_value] 

要選擇列值在鏈表some_values中的行,請使用isin

df.loc[df['column_name'].isin(some_values)] 

將多個條件與&組合使用:

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

要選擇列值不等於some_value的行,請使用!=

df.loc[df['column_name'] != some_value] 

isin返回一個布爾序列,因此要選擇其值不在some_values中的行,使用~取反布爾序列:

df.loc[~df['column_name'].isin(some_values)]

(8)dataframe根據多列的條件判斷生成新的一列

df['temp_tag']=df.apply(lambda x: (1 if x['12']-x['Ireference']>=55 else 0), axis=1)

df['次高溫差'] =df.apply(lambda x:(max(x['12'],x['22'],x['32'],x['42'],x['52'],x['62'])-np.sort([x['12'],x['22'],x['32'],x['42'],x['52'],x['62']])[4]),axis=1)

6.讀取文件

可查看原網站地址:https://i.cnblogs.com/EditPosts.aspx?postid=8323763

1.讀取excel

import pandas as pd
from pandas import DataFrame,Series

# 指定分隔符,也可用delimiter,讀取前10行數據
pd.read_table('filename', sep=',',nrows=10)
# 讀取特定大小的文件塊(byte)
pd.read_table('filename', chunksize=1000)

# 讀入DataFrame時,指定列名
pd.read_csv('filename', header=None)
pd.read_csv('filename', names=['a','b','c','d'])

# 指定列為索引,列d設為索引
pd.read_csv('filename', names=['a','b','c','d'], index_col='d')
# 層次化索引的話,可以index_col指定多個列名
pd.read_csv('filename', names=['a','b','c','d'], index_col=['c','d'])

# 跳過文件的某些行
pd.read_csv('filename', skiprows=[1,3,6])
# 需要忽略的行數,從尾部算起
pd.read_csv('filename', skip_footer=10)

# 讀文件缺失值處理,將文件中某些值設置為nan
pd.read_csv('filename', na_values=['NULL'])
# 將文件中滿足box條件的值設置為nan
box = {'col1':['foo','NA'], 'col3':['two']}
pd.read_csv('filename', na_values=['NULL'])
# 寫文件缺失值處理,將nan寫成na_rep
pd.read_csv('filename', na_rep='NULL')

# 日期解析,解析所有列,也可以指定,默認為False;
# 沖突型日期,看成國際標准格式,28/6/2016, 默認為False
pd.read_csv('filename', parse_dates=True, dayfirst=True)

# 設置編碼,數據解析后僅有一列返回Series
pd.read_csv('filename', encoding='utf-8', squeeze=True)

3.導出文件

#導出到CSV:
df.to_csv('SomeTable.csv', index=False)
df.to_csv('SomeTable.csv', index=False)
#導出到EXCEL:
df.to_excel('SomeTable.xls', index=False)
df.to_excel('SomeTable.xls', index=False)
#導出到TXT:
df.to_csv('SomeTable.txt', index=False)
df.to_csv('SomeTable.txt', index=False)

 str轉list可通過str.split(',')

   list 轉str可通過a = ','.join(['abc','def','ghi'])    >>>'abc,def,ghi',值得注意的是list里面的數據必須是字符串類型才可以


免責聲明!

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



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