拼接

Pandas提供了不同的方法将序列或索引与他们自己或者其他的对象进行拼接,所有的方法都是基于各自的cat()Index.str.cat

将单个序列拼接为一个完整字符串

序列或索引的内容可以进行拼接:

  1. In [41]: s = pd.Series(['a', 'b', 'c', 'd'])
  2. In [42]: s.str.cat(sep=',')
  3. Out[42]: 'a,b,c,d'

如果没有额外声明,sep 即分隔符默认为空字串,即sep=''

  1. In [43]: s.str.cat()
  2. Out[43]: 'abcd'

默认情况下,缺失值会被忽略。使用na_rep参数,可以对缺失值进行赋值:

  1. In [44]: t = pd.Series(['a', 'b', np.nan, 'd'])
  2. In [45]: t.str.cat(sep=',')
  3. Out[45]: 'a,b,d'
  4. In [46]: t.str.cat(sep=',', na_rep='-')
  5. Out[46]: 'a,b,-,d'

拼接序列和其他类列表型对象为新的序列

cat() 的第一个参数为类列表对象,但必须要确保长度与序列或索引相同.

  1. In [47]: s.str.cat(['A', 'B', 'C', 'D'])
  2. Out[47]:
  3. 0 aA
  4. 1 bB
  5. 2 cC
  6. 3 dD
  7. dtype: object

任何一端的缺失值都会导致之中结果为缺失值,除非使用na_rep

  1. In [48]: s.str.cat(t)
  2. Out[48]:
  3. 0 aa
  4. 1 bb
  5. 2 NaN
  6. 3 dd
  7. dtype: object
  8. In [49]: s.str.cat(t, na_rep='-')
  9. Out[49]:
  10. 0 aa
  11. 1 bb
  12. 2 c-
  13. 3 dd
  14. dtype: object

拼接序列与类数组对象为新的序列

New in version 0.23.0.

others 参数可以是二维的。此时,行数需要与序列或索引的长度相同。

  1. In [50]: d = pd.concat([t, s], axis=1)
  2. In [51]: s
  3. Out[51]:
  4. 0 a
  5. 1 b
  6. 2 c
  7. 3 d
  8. dtype: object
  9. In [52]: d
  10. Out[52]:
  11. 0 1
  12. 0 a a
  13. 1 b b
  14. 2 NaN c
  15. 3 d d
  16. In [53]: s.str.cat(d, na_rep='-')
  17. Out[53]:
  18. 0 aaa
  19. 1 bbb
  20. 2 c-c
  21. 3 ddd
  22. dtype: object

对齐拼接序列与带索引的对象成为新的序列

New in version 0.23.0.

对于拼接序列或者数据表,我们可以使用 join关键字来对齐索引。

  1. In [54]: u = pd.Series(['b', 'd', 'a', 'c'], index=[1, 3, 0, 2])
  2. In [55]: s
  3. Out[55]:
  4. 0 a
  5. 1 b
  6. 2 c
  7. 3 d
  8. dtype: object
  9. In [56]: u
  10. Out[56]:
  11. 1 b
  12. 3 d
  13. 0 a
  14. 2 c
  15. dtype: object
  16. In [57]: s.str.cat(u)
  17. Out[57]:
  18. 0 ab
  19. 1 bd
  20. 2 ca
  21. 3 dc
  22. dtype: object
  23. In [58]: s.str.cat(u, join='left')
  24. Out[58]:
  25. 0 aa
  26. 1 bb
  27. 2 cc
  28. 3 dd
  29. dtype: object

警告

如果不使用 join 关键字,cat()方法将会滚回到0.23.0版之前,即(无对齐)模式。但如果任何的索引不一致时,将会抛出一个FutureWarning 警告,因为在未来的版本中,默认行为将改为join='left'

join 的选项为('left', 'outer', 'inner', 'right')中的一个。特别的,对齐操作使得两个对象可以是不同的长度。

  1. In [59]: v = pd.Series(['z', 'a', 'b', 'd', 'e'], index=[-1, 0, 1, 3, 4])
  2. In [60]: s
  3. Out[60]:
  4. 0 a
  5. 1 b
  6. 2 c
  7. 3 d
  8. dtype: object
  9. In [61]: v
  10. Out[61]:
  11. -1 z
  12. 0 a
  13. 1 b
  14. 3 d
  15. 4 e
  16. dtype: object
  17. In [62]: s.str.cat(v, join='left', na_rep='-')
  18. Out[62]:
  19. 0 aa
  20. 1 bb
  21. 2 c-
  22. 3 dd
  23. dtype: object
  24. In [63]: s.str.cat(v, join='outer', na_rep='-')
  25. Out[63]:
  26. -1 -z
  27. 0 aa
  28. 1 bb
  29. 2 c-
  30. 3 dd
  31. 4 -e
  32. dtype: object

others是一个数据表时,也可以执行相同的对齐操作:

  1. In [64]: f = d.loc[[3, 2, 1, 0], :]
  2. In [65]: s
  3. Out[65]:
  4. 0 a
  5. 1 b
  6. 2 c
  7. 3 d
  8. dtype: object
  9. In [66]: f
  10. Out[66]:
  11. 0 1
  12. 3 d d
  13. 2 NaN c
  14. 1 b b
  15. 0 a a
  16. In [67]: s.str.cat(f, join='left', na_rep='-')
  17. Out[67]:
  18. 0 aaa
  19. 1 bbb
  20. 2 c-c
  21. 3 ddd
  22. dtype: object

将一个序列与多个对象拼接为一个新的序列

所有的一维,类列表对象都可以任意组合进一个类列表的容器(包括迭代器,dict-视图等):

  1. In [68]: s
  2. Out[68]:
  3. 0 a
  4. 1 b
  5. 2 c
  6. 3 d
  7. dtype: object
  8. In [69]: u
  9. Out[69]:
  10. 1 b
  11. 3 d
  12. 0 a
  13. 2 c
  14. dtype: object
  15. In [70]: s.str.cat([u, pd.Index(u.values), ['A', 'B', 'C', 'D'], map(str, u.index)], na_rep='-')
  16. Out[70]:
  17. 0 abbA1
  18. 1 bddB3
  19. 2 caaC0
  20. 3 dccD2
  21. dtype: object

所有的元素必须与序列或索引有相同的长度,除了那些有索引的,且join不为None的对象:

  1. In [71]: v
  2. Out[71]:
  3. -1 z
  4. 0 a
  5. 1 b
  6. 3 d
  7. 4 e
  8. dtype: object
  9. In [72]: s.str.cat([u, v, ['A', 'B', 'C', 'D']], join='outer', na_rep='-')
  10. Out[72]:
  11. -1 --z-
  12. 0 aaaA
  13. 1 bbbB
  14. 2 cc-C
  15. 3 dddD
  16. 4 --e-
  17. dtype: object

如果在一个包含不同的索引的others列表上使用join='right',所有索引的并集将会被作为最终拼接的基础:

  1. In [73]: u.loc[[3]]
  2. Out[73]:
  3. 3 d
  4. dtype: object
  5. In [74]: v.loc[[-1, 0]]
  6. Out[74]:
  7. -1 z
  8. 0 a
  9. dtype: object
  10. In [75]: s.str.cat([u.loc[[3]], v.loc[[-1, 0]]], join='right', na_rep='-')
  11. Out[75]:
  12. -1 --z
  13. 0 a-a
  14. 3 dd-
  15. dtype: object