pandas官方文档中cookbook(3)的selection&new column&multiindexing翻译

来源:互联网 发布:三维人像建模软件 编辑:程序博客网 时间:2024/06/08 10:15

文档版本:0.20.3
这些例子是用python3.4写出来的。对于较早的python版本需要对代码做些相应的调整。
Pandas(pd)和Numpy(np)是唯一两个默认导入的包。其余的包会显示导入给新用户看。这份文档中的例子都是从Stack-Overflow和Github中别人提问的比较经典的问题,作者从中进行提炼与总结。

若有翻译不当的地方,请多多指教。

选取

数据框

同时使用列标签和值判断条件进行索引

In [27]: df = pd.DataFrame(....:      {'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}); df....: Out[27]:     AAA  BBB  CCC0    4   10  1001    5   20   502    6   30  -303    7   40  -50In [28]: df[(df.AAA <= 6) & (df.index.isin([0,2,4]))]Out[28]:     AAA  BBB  CCC0    4   10  1002    6   30  -30

使用loc对索引标签和iloc对索引位置进行切片

In [29]: data = {'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}In [30]: df = pd.DataFrame(data=data,index=['foo','bar','boo','kar']); dfOut[30]:         AAA  BBB  CCCfoo    4   10  100bar    5   20   50boo    6   30  -30kar    7   40  -50

这里有2中显示切片的方法,在三种情况下:
1.以位置为导向的索引(Python切片风格:该切片前闭后开)
2.以索引名为导向的索引(非Python切片风格:该切片前闭后闭)
3.一般索引

In [31]: df.loc['bar':'kar'] #LabelOut[31]:     AAA  BBB  CCCbar    5   20   50boo    6   30  -30kar    7   40  -50# GenericIn [32]: df.iloc[0:3]Out[32]:     AAA  BBB  CCCfoo    4   10  100bar    5   20   50boo    6   30  -30In [33]: df.loc['bar':'kar']Out[33]:     AAA  BBB  CCCbar    5   20   50boo    6   30  -30kar    7   40  -50

当索引由不从零开始或不安最小单位增长的整数组成的时,就会出现混乱。

In [34]: df2 = pd.DataFrame(data=data,index=[1,2,3,4]); #Note index starts at 1.In [35]: df2.iloc[1:3] #Position-orientedOut[35]:     AAA  BBB  CCC2    5   20   503    6   30  -30In [36]: df2.loc[1:3] #Label-orientedOut[36]:     AAA  BBB  CCC1    4   10  1002    5   20   503    6   30  -30

使用‘~’符号获得标记的剩余部分(也就是反向操作)

In [37]: df = pd.DataFrame(....:      {'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40], 'CCC' : [100,50,-30,-50]}); df....: Out[37]:     AAA  BBB  CCC0    4   10  1001    5   20   502    6   30  -303    7   40  -50In [38]: df[~((df.AAA <= 6) & (df.index.isin([0,2,4])))]Out[38]:     AAA  BBB  CCC1    5   20   503    7   40  -50In [37]: df = pd.DataFrame(....:      {'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40], 'CCC' : [100,50,-30,-50]}); df....: Out[37]:     AAA  BBB  CCC0    4   10  1001    5   20   502    6   30  -303    7   40  -50In [38]: df[~((df.AAA <= 6) & (df.index.isin([0,2,4])))]Out[38]:     AAA  BBB  CCC1    5   20   503    7   40  -50

创建新列

使用applymap高效、动态地创建一个新列

In [48]: df = pd.DataFrame(....:      {'AAA' : [1,2,1,3], 'BBB' : [1,1,2,2], 'CCC' : [2,1,3,1]}); df....: Out[48]:     AAA  BBB  CCC0    1    1    21    2    1    12    1    2    33    3    2    1In [49]: source_cols = df.columns # or some subset would work too.In [50]: new_cols = [str(x) + "_cat" for x in source_cols]In [51]: categories = {1 : 'Alpha', 2 : 'Beta', 3 : 'Charlie' }In [52]: df[new_cols] = df[source_cols].applymap(categories.get);dfOut[52]:     AAA  BBB  CCC  AAA_cat BBB_cat  CCC_cat0    1    1    2    Alpha   Alpha     Beta1    2    1    1     Beta   Alpha    Alpha2    1    2    3    Alpha    Beta  Charlie3    3    2    1  Charlie    Beta    Alpha

在对数据框分组后对其中一列使用min()函数操作并保存其他列不是取最小值。

In [53]: df = pd.DataFrame(....:      {'AAA' : [1,1,1,2,2,2,3,3], 'BBB' :  [2,1,3,4,5,1,2,3]}); df....: Out[53]:     AAA  BBB0    1    21    1    12    1    33    2    44    2    55    2    16    3    27    3    3

方法1:用idxmin()获取最小值所在列的索引

In [54]: df.loc[df.groupby("AAA")["BBB"].idxmin()]Out[54]:     AAA  BBB1    1    15    2    16    3    2

方法2:先排序然后取每个分组的第一个值

In [55]: df.sort_values(by="BBB").groupby("AAA", as_index=False).first()Out[55]:     AAA  BBB0    1    11    2    12    3    2

注意结果虽然一样,不过索引不一样。

层次化索引

从一个含有标签的数据框中创建一个多重索引

In [56]: df = pd.DataFrame({'row' : [0,1,2],....:                    'One_X' : [1.1,1.1,1.1],....:                    'One_Y' : [1.2,1.2,1.2],....:                    'Two_X' : [1.11,1.11,1.11],....:                    'Two_Y' : [1.22,1.22,1.22]}); df....: Out[56]:     One_X  One_Y  Two_X  Two_Y  row0    1.1    1.2   1.11   1.22    01    1.1    1.2   1.11   1.22    12    1.1    1.2   1.11   1.22    2# 设置索引In [57]: df = df.set_index('row');dfOut[57]:  One_X  One_Y  Two_X  Two_Yrow                            0      1.1    1.2   1.11   1.221      1.1    1.2   1.11   1.222      1.1    1.2   1.11   1.22# With Hierarchical ColumnsIn [58]: df.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns]);dfOut[58]:     One        Two          X    Y     X     Yrow                      0    1.1  1.2  1.11  1.221    1.1  1.2  1.11  1.222    1.1  1.2  1.11  1.22# Now stack & ResetIn [59]: df = df.stack(0).reset_index(1);dfOut[59]: level_1     X     Yrow                    0       One  1.10  1.200       Two  1.11  1.221       One  1.10  1.201       Two  1.11  1.222       One  1.10  1.202       Two  1.11  1.22# And fix the labels (Notice the label 'level_1' got added automatically)In [60]: df.columns = ['Sample','All_X','All_Y'];dfOut[60]:         Sample  All_X  All_Yrow                     0      One   1.10   1.200      Two   1.11   1.221      One   1.10   1.201      Two   1.11   1.222      One   1.10   1.202      Two   1.11   1.22
原创粉丝点击