pandas遗留的操作

pivot:

# 个人理解就是选择1对1个变量,或者1对多个变量进行研究(从以index作为索引的dataframe,作左上角有斜线的一个分析表)
	foo	bar	baz	zoo
0	one	A	1	x
1	one	B	2	y
2	one	C	3	z
3	two	A	4	q
4	two	B	5	w
5	two	C	6	t
# pivot,选择新的index和colmns进行分析/出表格
dfp = df.pivot(index='foo', columns=['bar','baz'], values='zoo' )
dfp
# 得到
      bar	A	B	C	A	B	C
      baz	1	2	3	4	5	6
foo						
one	        x	y	z	NaN	NaN	NaN
two	        NaN	NaN	NaN	q	w	t
# 这时候的colmns是MultiIndex
dfp.columns
# 得到
MultiIndex([('A', 1),
            ('B', 2),
            ('C', 3),
            ('A', 4),
            ('B', 5),
            ('C', 6)],
           names=['bar', 'baz'])

melt:

# 固定一个量id_vars,观测values_vars的对应值,另一种展示双变量的方法
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
                   'B': {0: 1, 1: 3, 2: 5},
                   'C': {0: 2, 1: 4, 2: 6}})
df
# 得到
        A	B	C
0	a	1	2
1	b	3	4
2	c	5	6
# melt
pd.melt(df, id_vars=['A'], value_vars=['B', 'C'])
# 得到
       A    variable	value
0	a	B	1
1	b	B	3
2	c	B	5
3	a	C	2
4	b	C	4
5	c	C	6

concat:可以水平拼接和垂直拼接,

# 水平:axis=1
pd.concat([df1,df3],axis=1,join='inner')
# 垂直:axis=0,这里join='inner'代表着如果两个df的columns不一样,拼接后删除所有columns里面有nan的columns,不想删除就不加这个
pd.concat([df1,df3],axis=0,join='inner')

stack

# 和melt很像,也是展示的一种方法,就是把column都移到index里面从index来看数据
multicol2 = pd.MultiIndex.from_tuples([('weight', 'kg'),
                                       ('height', 'm')])
df_multi_level_cols2 = pd.DataFrame([[1.0, 2.0], [3.0, 4.0]],
                                    index=['cat', 'dog'],
                                    columns=multicol2)
df_multi_level_cols2
# 得到
       weight	height
        kg	m
cat	1.0	2.0
dog	3.0	4.0
# stack
df_multi_level_cols2.stack()
# 这里只移了一层col过去,没一次stack都是移动一层
		height	weight
cat	kg	NaN	1.0
         m	2.0	NaN
dog	kg	NaN	3.0
         m	4.0	NaN

numpy,scipy相关

1. random相关:

# sample,randint
# 随机数[0,1),可以仍选size
a = np.random.random((3,3))
print(a)
# 随机整数
b = np.random.randint(low=3,high=10,size=(3,3))
print(b)
# 从正态分布里随机--->这里不用tuple!!!
n = np.random.randn(3,3)
print(n)
# 一些简单变换可以随机float在任意区间
k,b = 3,4 # --> [4,7) 
any = k*np.random.random((3,3))+b
print(any)
# 从一个一维array里面随机抽样
arr = np.linspace(0,10,10)
print(arr)
sample = np.random.choice(arr,size=10)
print(sample)
# sample函数 ---> 本质和random一样 [0,1)
sam = np.random.sample((3,3))
print(sam)

结果

[[0.37043994 0.12008028 0.00131827]
 [0.78523415 0.66069635 0.1164305 ]
 [0.83860858 0.42444314 0.13343647]]
[[5 9 4]
 [3 8 6]
 [5 7 3]]
[[-0.074154    0.76728928 -0.20197347]
 [ 0.49179239 -1.24235808 -1.04386071]
 [-0.38443735  0.06529597  1.44297735]]
[[6.82208288 4.02348195 5.18859716]
 [5.91247924 6.04780045 5.94768461]
 [4.84206642 6.93951297 6.0301323 ]]
[ 0.          1.11111111  2.22222222  3.33333333  4.44444444  5.55555556
  6.66666667  7.77777778  8.88888889 10.        ]
[4.44444444 6.66666667 0.         4.44444444 3.33333333 3.33333333
 1.11111111 2.22222222 3.33333333 1.11111111]
[[0.65146107 0.54263457 0.97589871]
 [0.46533061 0.49519949 0.18034651]
 [0.69027545 0.51105573 0.25653142]]
# permutation,choice
# 人工实现np.random.choice
arr = np.linspace(0,10,10)
print('arr,',arr)
sample = np.random.choice(arr,size=10)
print('choice:',sample)
rint = np.random.randint(0,10,10)
print(rint)
print('manuell choice:',arr[rint])

结果

arr, [ 0.          1.11111111  2.22222222  3.33333333  4.44444444  5.55555556
  6.66666667  7.77777778  8.88888889 10.        ]
choice: [ 3.33333333  7.77777778  5.55555556  0.          7.77777778 10.
  6.66666667 10.         10.         10.        ]
[0 7 2 3 2 4 7 2 0 0]
manuell choice: [0.         7.77777778 2.22222222 3.33333333 2.22222222 4.44444444
 7.77777778 2.22222222 0.         0.        ]
# shuffle 随机排序
arr2 = np.linspace(0,10,11)
print(arr2)
np.random.shuffle(arr2)
print(arr2)
# permutate 排列组合
print(np.random.permutation(10))
arr3 = np.arange(9).reshape((3,3))
print(np.random.permutation(arr3))

结果

[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
[ 7.  3.  4.  5.  1.  8.  6.  2.  9.  0. 10.]
[6 5 8 3 4 9 7 0 2 1]
[[3 4 5]
 [6 7 8]
 [0 1 2]]

2. 新建矩阵相关:eye,zero,random

print(np.eye(3,3))
print(np.zeros((3,3)))
print(np.arange(9).reshape(3,3))
print(np.random.random((3,3)))
print(pd.DataFrame(np.random.random((3,3))))

结果

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[0.52634137 0.39941736 0.61091552]
 [0.25527999 0.577708   0.38547358]
 [0.54730596 0.18127438 0.76034667]]
          0         1         2
0  0.850191  0.364884  0.679979
1  0.446563  0.336554  0.161733
2  0.334904  0.453234  0.835087

3. distribution相关:

# 分布
bi = np.random.binomial(n=10,p=0.5,size=10)
exp = np.random.exponential(size=10)
f = np.random.f(dfnum=3,dfden=3)
# gamma = 
# normal = 
# poisson = 
# standard_normal = 
# 背后伪随机数产生的方法 --> https://zh.wikipedia.org/wiki/%E6%A2%85%E6%A3%AE%E6%97%8B%E8%BD%AC%E7%AE%97%E6%B3%95

scipy.stats---->TODO