合并数组

合并列 - join

注意 必须行索引有相同 列索引有所不同才能合并在一起

  1. >>> a = pd.DataFrame(np.arange(12).reshape(3,4),columns=list('wxyz'))
  2. >>> a
  3. w x y z
  4. 0 0 1 2 3
  5. 1 4 5 6 7
  6. 2 8 9 10 11
  7. >>> b = pd.DataFrame(np.arange(4).reshape(2,2),columns=list('sb'))
  8. >>> b
  9. s b
  10. 0 0 1
  11. 1 2 3
  12. >>> a.join(b)
  13. w x y z s b
  14. 0 0 1 2 3 0.0 1.0
  15. 1 4 5 6 7 2.0 3.0
  16. 2 8 9 10 11 NaN NaN
  17. >>> b.join(a)
  18. s b w x y z
  19. 0 0 1 0 1 2 3
  20. 1 2 3 4 5 6 7

合并行 - merge

没有看的很懂http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html
在a的下方拼接b:

  1. import pandas as pd
  2. import numpy as np
  3. a = pd.DataFrame(np.arange(9).reshape(3,3), columns=list('abc'))
  4. b = pd.DataFrame(np.arange(12,24).reshape(4,3), columns=list('abc'))
  5. print(a.merge(b,how='outer'))
  6. ---------output---------------
  7. a b c
  8. 0 0 1 2
  9. 1 3 4 5
  10. 2 6 7 8
  11. 3 12 13 14
  12. 4 15 16 17
  13. 5 18 19 20
  14. 6 21 22 23

如果有不同的列将补全nan:

  1. import pandas as pd
  2. import numpy as np
  3. a = pd.DataFrame(np.arange(9).reshape(3,3), columns=list('abc'))
  4. b = pd.DataFrame(np.arange(20,36).reshape(4,4), columns=list('abcd'))
  5. print(a.merge(b,how='outer'))
  6. print(b.merge(a,how='outer'))
  7. -----------output-----------------
  8. a b c d
  9. 0 0 1 2 NaN
  10. 1 3 4 5 NaN
  11. 2 6 7 8 NaN
  12. 3 20 21 22 23.0
  13. 4 24 25 26 27.0
  14. 5 28 29 30 31.0
  15. 6 32 33 34 35.0

获取两个数组中某一列有重合部分的所有行的全部数据

  1. a
  2. a b c
  3. 0 0 1 2
  4. 1 3 4 5
  5. 2 6 7 8
  6. b
  7. a b c d
  8. 0 3 11 12 13
  9. 1 14 15 16 17
  10. 2 18 19 20 21
  11. 3 22 23 24 25
  12. b.merge(a,on='a')
  13. a b_x c_x d b_y c_y
  14. 0 3 11 12 13 4 5
  15. ab两个数组中 b c两列是命名重复的,merge取了a列相同(3)的所有行,
  16. _x是属于b的(前面一个),_y是属于a的(后面一个)

分组和聚合

groupby分组

  1. import pandas as pd
  2. import numpy as np
  3. a = pd.DataFrame(np.arange(9).reshape(3,3), columns=list('abc'))
  4. b = a.groupby(by='a')
  5. print(a)
  6. for i in b:
  7. print(i)
  8. ------output------
  9. a b c
  10. 0 0 1 2
  11. 1 3 4 5
  12. 2 6 7 8
  13. (0, a b c
  14. 0 0 1 2)
  15. (3, a b c
  16. 1 3 4 5)
  17. (6, a b c
  18. 2 6 7 8)
  19. 可见 i 是元组类型,当a包含许多国家的多种保护动物的数据,我们便可以迅速将他们按国家分类

如果在这里直接print(b.count())
将直接统计出 相同a的不同个体b,c的数量和。(比如计算有多少类保护动物,总数多少)

groupby还可以用来计算不同组别的均值
参考:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

  1. >>> df = pd.DataFrame({'Animal' : ['Falcon', 'Falcon',
  2. ... 'Parrot', 'Parrot'],
  3. ... 'Max Speed' : [380., 370., 24., 26.]})
  4. >>> df
  5. Animal Max Speed
  6. 0 Falcon 380.0
  7. 1 Falcon 370.0
  8. 2 Parrot 24.0
  9. 3 Parrot 26.0
  10. >>> df.groupby(['Animal']).mean()
  11. Max Speed
  12. Animal
  13. Falcon 375.0
  14. Parrot 25.0

多条件分组

1985-2016自杀情况.zip
原始数据大概是这样的
image.png
我想看一下每个国家每年的人口和人类发展指数,其中有一个问题就是.mean()将age省略的,原因有可能是里面压根就不是数字,无法计算,但是呢 我也没想到什么好办法将 ‘DataFrameGroupBy’ objects转化为frame.DataFrame

  1. import pandas as pd
  2. import numpy as np
  3. data = pd.read_csv('/home/kesci/master.csv')
  4. data = data.loc[:,['country','year','age','population','HDI for year']]
  5. print(data.groupby(by=['country','year']).mean().sort_values(by='population'))

输出大约是:(hdi前面部分没有数据)

  1. population HDI for year
  2. country year
  3. San Marino 1999 2.099333e+03 NaN
  4. 2000 2.114083e+03 NaN
  5. 2005 2.355333e+03 NaN
  6. Saint Kitts and Nevis 1990 3.258333e+03 NaN
  7. 1992 3.258333e+03 NaN
  8. 1991 3.258333e+03 NaN
  9. Seychelles 1985 4.775000e+03 NaN
  10. 1986 4.783333e+03 NaN
  11. 1987 4.858333e+03 NaN
  12. Antigua and Barbuda 1989 4.936500e+03 NaN
  13. 1990 4.944500e+03 NaN
  14. 1988 4.963667e+03 NaN
  15. 1987 5.021750e+03 NaN
  16. 1991 5.032833e+03 NaN
  17. 1986 5.105833e+03 NaN
  18. 1992 5.145083e+03 NaN
  19. Kiribati 1991 5.154583e+03 NaN

交叉分组

例如在用户购买商品类别的统计中 我们我们有一张mt表,我们想要获取一个用户user_id购买的商品类别aisle购买次数的统计,我们可以使用pd.crosstab(mt[columns1],mt[columns2])来建立一张新的表格
image.png
image.png

对每一列进行条件赋值(修改)apply - lambda

例如我想将timeStamp修改为全为日期而不要具体时间的

  1. count timeStamp
  2. 0 1 [2015-12-10, 17:10:52]
  3. 1 1 [2015-12-10, 17:29:21]
  4. 2 1 [2015-12-10, 14:39:21]
  5. 3 1 [2015-12-10, 16:47:36]
  6. 4 1 [2015-12-10, 16:56:52]
  7. 5 1 [2015-12-10, 15:39:04]
  8. last_data["timeStamp"] = last_data.timeStamp.apply(lambda x: x[0] if True else np.nan)
  9. count timeStamp
  10. 0 1 2015-12-10
  11. 1 1 2015-12-10
  12. 2 1 2015-12-10
  13. 3 1 2015-12-10
  14. 4 1 2015-12-10
  15. 5 1 2015-12-10

last_data["timeStamp"] = last_data.timeStamp.apply(lambda x: x[0] if True else np.nan)

**

参考:

  1. import numpy as np
  2. import pandas as pd
  3. data = {'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou', 'Chongqing'],
  4. 'year': [2016,2016,2015,2017,2016, 2016],
  5. 'population': [2100, 2300, 1000, 700, 500, 500]}
  6. frame = pd.DataFrame(data, columns = ['year', 'city', 'population', 'debt'])
  7. # 使用apply函数, 如果city字段包含'ing'关键词,则'判断'这一列赋值为1,否则为0
  8. frame['panduan'] = frame.city.apply(lambda x: 1 if 'ing' in x else 0)
  9. print(frame)

删除列

Series方法与DataFrame差不多,这里只介绍后者如何使用,前者相似。
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=[‘A’, ‘B’, ‘C’, ‘D’])
In [4]: df
Out[4]:
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
axis=1(按列方向操作)、inplace=True(修改完数据,在原数据上保存)
一:按标签来删除列
df.drop([‘B’,’C’],axis=1,inplace=True)
A D
0 0 3
1 4 7
2 8 11
二:按序号来删除列
x = [1,2] #删除多列需给定列表,否则参数过多
df.drop(df.columns[x],axis=1,inplace=True)
A D
0 0 3
1 4 7
2 8 11
三:按序号来删除行
df.drop([0,1],inplace=True) #默认axis=0
A B C D
2 8 9 10 11
——————————-
参考:https://blog.csdn.net/qq_36523839/article/details/80061326