python pandas 資料框 條件選取行列資料
阿新 • • 發佈:2019-01-05
一、選取幾列組成新的dataframe:
df = df[['A列列明', 'S列列明', 'H列列明']]
二、選取某列'STATUS'裡面元素為"ACTIVE"的行,即刪掉列STATUS元素不是ACTIVE的行
df = df[df['STATUS'] == "ACTIVE"]
(單項條件搜尋,類似SELECT ALL WHERE df.STATUS = ACTIVE)
三、選取'BADTHING'列為元素空的行,既badthing這列有內容的行全部去掉,組成一個新的dataframe
df = df[df['BADTHING'].isnull()]
(空值搜尋)
四、選取GOODREASON列元素為列表 ['quality', 'cheap']內元素的行
df = df[df['GOODREASON'].isin(['quality', 'cheap'])]
(多項條件搜尋,類似SELECT ALL WHERE df.GOODREASON= quality AND cheap)
五、分組並進行遍歷,運用groupby和for:
groupByNew = df.groupby('CITY', sort=False)
for name, groupData in groupByNew:
# TODO …… ……
如程式碼所示,我們可以對dataframe以某列'CITY'進行分組。我們如何取出某組的資料呢?當然是用
for迴圈。取出來的name即是組名,而groupData同樣是一個dataframe,可以進行更進一步操作。
六、對Series資料進行排序:
series= series.sort_values(ascending=False) # 進行從大到小排序
進階:關於groupby的一些資訊:
在進行groupby運算後,直接列印會得一個object資訊,新增groups引數後
print df.groupby(by=['CITY']).groups
打印出來會是帶group標籤和原資料行標籤(也就是原來dataframe裡面對應行的index)的組合資訊:
{'BEIJING': [25998L, 26134L, 26135L, 26235L, 26340L], 'SHANGHAI': [33370L, 33426L, 33541L], 'CHENGDU': [26153L]
我們可以看到,按照groups來print,得出city為北京的情況下,對應原來的行標籤第25998行、26134行等
即使指定了某列:
print df.groupby(by=['CITY'])['QUANTITY'].groups
依然會得出相同的結果:
{'BEIJING': [25998L, 26134L, 26135L, 26235L, 26340L], 'SHANGHAI': [33370L, 33426L, 33541L], 'CHENGDU': [26153L]
除非我們把每個分組的所有行都整理成一行,如用sum來求和:
print df.groupby(by=['CITY'])['QUANTITY'].sum()
這樣就可以成功轉換成dataframe了:
CITY
BEIJING 5
SHANGHAI 207
CHENGDU 518
……
彙總說明如下:
print '----------NEW------------\n', type(df.groupby(by=['CITY']))
print '----------NEW------------\n', type(df.groupby(by=['CITY']).sum())
print '----------NEW------------\n', type(df.groupby(by=['CITY'])['QUANTITY'])
print '----------NEW------------\n', type(df.groupby(by=['CITY'])['QUANTITY'].sum())
所得結果為:
----------NEW------------
----------NEW------------
----------NEW------------
----------NEW------------
說明:
一個dataframe經過groupby以後得到的型別是pandas.core.groupby.DataFrameGroupBy。而用for in迴圈取出的每個項的型別是pandas.core.frame.DataFrame
一個dataframe經過groupby再進行sum以後仍然是dataframe(不過具體通過那一列來sum有待考證)
一個dataframe經過groupby以後再進行列選取,得到的是pandas.core.groupby.SeriesGroupBy型別。可知用for in迴圈取出的是pandas.core.series.Series
一個series經過groupby再進行sum以後仍然是series