# 【学习】Python pandas+numpy+可视化

20190605

pandas.png

numpy.png

### 四、经典60题：

1、Python 中 （&，|）和（and，or）之间的区别

image.png

2、Count the number of each type of animal in df.

``````df['animal'].value_counts()
``````

3、pivot_table函数进行表的重建
For each animal type and each number of visits, find the mean age. In other words, each row is an animal, each column is a number of visits and the values are the mean ages (hint: use a pivot table).

``````df.pivot_table(values='age',index='animal',columns='visits') #以animal为索引，列为visits的各种值（有多少visits值，就有多少列），匹配的values为age的值
``````

4、pandas+-*/的应用
how do you subtract the row mean from each element in the row?

``````df = pd.DataFrame(np.random.random(size=(5, 3)))
df.sub(df.mean(axis=1),axis=0)
``````

5、返回column或index的最小值/最大值序号
Suppose you have DataFrame with 10 columns of real numbers, for example:
df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))
Which column of numbers has the smallest sum? (Find that column's label.)

``````df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))
df.sum().idxmin()
``````

6、返回特定的column或index

（2）返回特定列，思路其实是和返回行一样的，只是需要用到loc/iloc函数，用loc可以进行复杂操作：

``````import pandas as pd
items2 = [{'bikes': 20, 'pants': 30, 'watches': 35, 'shirts': 15, 'shoes':8, 'suits':45},
{'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5, 'shirts': 2, 'shoes':5, 'suits':7},
{'bikes': 20, 'pants': 30, 'watches': 35, 'glasses': 4, 'shoes':10}]

# 创建一个DataFrame并设置行索引
df = pd.DataFrame(items2, index = ['store 1', 'store 2', 'store 3'])
b=df.loc[:,df.isnull().sum(axis=0)==1].columns.tolist()
#返回该列具有一个nan值的列名称
``````

6、去除重复行/列

7、pandas处理nan值
（1）、创建含有nan值的dataframe：

``````df=pd.DataFrame({'A':[1,2,3],'B':[1,2,3],'C':[1,2,3],'D':['','',''],'E':['','',''],'F':['','',''],'G':['','',''],'H':['','',''],'I':['','',''],'J':['','','']})
type(df.loc[1,'J'])  #显示为str
``````
``````df=pd.DataFrame({'A':[1,2,3],'B':[1,2,3],'C':[1,2,3]})
df['D']='NaN'
type(df.loc[1,'D'])  #显示为str
``````

``````items2 = [{'bikes': 20, 'pants': 30, 'watches': 35, 'shirts': 15, 'shoes':8, 'suits':45},
{'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5, 'shirts': 2, 'shoes':5, 'suits':7},
{'bikes': 20, 'pants': 30, 'watches': 35, 'glasses': 4, 'shoes':10}]

df = pd.DataFrame(items2, index = ['store 1', 'store 2', 'store 3'])
df.loc['store 1','glasses']          #返回nan（不是NaN）
type(df.loc['store 1','glasses'])        #返回 numpy.float64
``````
``````# 计算在store_items中NaN值的个数
x =  store_items.isnull().sum().sum()

# 输出
print('在我们DataFrame中NaN的数量:', x)
``````

``````df.count().count()
``````

count不同于sum，count只针对1/0进行处理，sum是对具体数值进行处理。

8、多索引groupby
For each group, find the sum of the three greatest values.

``````df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'),
'vals': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})
#df.groupby(['grps'])['vals'].nlargest(3)      #nlargest（3）构建了一个包含1级索引的新的dataframe，并且只含有最大的三个数
df.groupby(['grps'])['vals'].nlargest(3).sum(level=0)
``````

``````df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'),
'vals': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})

df['rank']=df.groupby(['grps'])['vals'].rank(method='dense',ascending=False)
(df[df.loc[:,'rank']<4].groupby(['grps'])['vals']).sum()
``````

1、字符串处理为数值
Create a lambda function and change the type of item price：（原来的item_price格式是字符型，如\$2.39）

``````chipo['item_price']=chipo['item_price'].transform(lambda x:float(x[1:-1]))#这种方法比字符串转化要简单！
``````

2、返回不重复行的总行数

``````chipo.item_name.value_counts().count()
``````

``````chipo.groupby('item_name').sum().count()
``````

3、panda关于字符串处理的函数

``````euro12[euro12.Goals>6].Team
``````

``````euro12[euro12.Team.str.startswith('G')]
``````

4、loc/iloc用于筛选行名/列名，如何筛选列里面的值？
Present only the Shooting Accuracy from England, Italy and Russia

``````euro12.loc[euro12.Team.isin(['England', 'Italy', 'Russia']), ['Team','Shooting Accuracy']]
``````

5、stack和unstack方法
https://www.cnblogs.com/bambipai/p/7658311.html

image.png

6、groupby后直接打印group的方法(有点像enumerate可以返回序数和值)

``````# Group the dataframe by regiment, and for each regiment,
for name, group in regiment.groupby('regiment'):
# print the name of the regiment
print(name)
# print the data of that regiment
print(group)
``````

7、agg、transform、apply、applymap、map的比较
（1） agg只能用自带函数（mean、sum这些）进行数值运算，允许不同列进行不同运算；
（2）transform允许：匿名函数+自带函数（mean、sum这些）+自定义函数，只允许对单列进行单个/多个运算；
（3）apply允许：匿名函数+自定义函数，相比transform不允许自带函数，同时是以series作为计算单位的（当只有一个series时，可以是针对每个数据的单独运算，当是一组series时，则必须是min、max这种聚集函数）；
（4）applymap是以所有元素进行运算的；
（5）map是针对series的每个元素进行运算的。

8、转换为时间格式dateme64
https://blog.csdn.net/qq_36523839/article/details/79746977

· 1/17/07 has the format "%m/%d/%y"
· 17-1-2007 has the format "%d-%m-%Y"

9、生成随机整数，要用np.random.randint()函数

10、np.random.rand和np.random.random的区别
https://blog.csdn.net/xia_ri_xing/article/details/82949004

11、concat、union、append和merge
mysql的union和pd.append差不多，都是组成更多的行
pd.concat既可以组成行，也可以扩展成列，所以综合来说最方便。
pd.concat相比merge：merge是正宗的表的联结，concat只能是表的组合，不具备根据某列进行join的功能，而且concat的join也只是针对联结的两个表，连接后是保留原来表所有的columns（outer），还是保留两个都有的columns（inner）。所以concat的join是对列说的，merge的join是对行数据来说的。

12、处理dataframe或者series多级索引的方式
series如果存在多级索引很难提取，可以先to_frame转化成dataframe，再reset_index，把多级转化成column，再提取列名；
dataframe里面的列如果要重新设置为多级索引，有一个dataframe.columns=pd.MultiIndex.from_product()的方法