Python 合并list,dict,数组

1.用字典将相同index的列放到同一列

# 将index相同的行放到同一列
from collections import defaultdict
data = [['a', 1],['a', 3],['b',1],['b',2],['c',1],['c', 5]]
dict_data = defaultdict(set)
for line in data:
	if len(line) > 1:
		dict_data[line[0]].update(line[1:])
print(dict_data)
#输出
out: defaultdict(<class 'set'>, {'a': {1, 3}, 'b': {1, 2}, 'c': {1, 5}})

2.函数返回多个值只取其中一个

#定义函数
def test():
	a = 1
	b = 2
	c = 3
	return a,b,c
#取test函数的b 
b = test()[1]
print("b = ",b)

#结果
b = 2

3.python按行、列合并

3.1 python合并列表list

1.extend():向列表尾部追加一个列表

a = [1,2,3,4,5]
b = ['A','B','C','D']
a.extend(b)
print(a)
#输出
[1,2,3,4,5,'A','B','C','D']

2.append():向列表尾部追加一个新元素,新元素只占一个索引位

a = [1,2,3,4,5]
b = ['A','B','C','D']
a.append(b)
print(b)
#输出
[1,2,3,4,5,['A','B','C','D']]

3.a+b:看上去和extend()一样,但是生成了一个新的列表存两个列表的和

a = [1,2,3,4,5]
b = ['A','B','C','D']
c = a+b
print(c)
#输出
[1,2,3,4,5,'A','B','C','D']

4.a+=b:效果和extend()一样,也是在原有列表上增加

a = [1,2,3,4,5]
b = ['A','B','C','D']
c = a+b
print(c)
#输出
[1,2,3,4,5,'A','B','C','D']

5.切片,a[0:0]

a = [1,2,3,4,5]
b = ['A','B','C','D']
a[0:0] = b
print(a)
#输出
['A','B','C','D',1,2,3,4,5]
a[1:0] = b 
#输出
print(a)
[1,'A','B','C','D',2,3,4,5]

3.2python合并字典dict

相同key的value会被覆盖掉

1.dict(a,**b):b会覆盖a中key相同的value,结果是所有不同key的value, python 2 不支持,python3.5及以上支持

#适用于所有key值不同的dict
a = {'age':17, 'name':'Mary', 'gender':'female'}
b = {'age':19, 'name':'Joe','grade':90,'class':'Two'}
c = dict(a, **b)
print(c)
#输出
{'age': 19, 'name': 'Joe', 'sex': 'female', 'grade': 90, 'class': 'Two'}

2.dict(a.items()+b.items()) ,python3不支持

#仅适用于python2
a = {'age':17, 'name':'Mary', 'gender':'female'}
b = {'age':19, 'name':'Joe','grade':90,'class':'Two'}
c = dict(a.items()+b.items())
print c
#输出,b覆盖a中key相同的value
{'grade': 90, 'gender': 'female', 'age': 19, 'name': 'Joe', 'class': 'Two'}

3.update()

a.update(b)
print(a)
#或者,不改变a
c = {}
c.update(a)#或者 c = a.copy()
c.update(b)
print(c)
#输出
{'age': 19, 'name': 'Joe', 'gender': 'female', 'grade': 90, 'class': 'Two'}

4.字典的常规处理方法

for k, v in a.items():
	c[k] = v
for k, v in b.items():
	c[k] = v
print(c)
#输出
{'age': 19, 'name': 'Joe', 'gender': 'female', 'grade': 90, 'class': 'Two'}

3.3python合并数组,numpy库

3.3.1 数组横向合并,按行

1.np.vstack()

import numpy as np
a = [[1,2,3],[4,5,6]]#列表和数组类型都适用
b = [[7,8,9],[3,3,3]]
c = np.vstack((a,b))
print(c)
#输出,类型是数组型
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [3, 3, 3]])

2.np.r_[ ]

c = np.r_[a,b]
print(c)
#输出,类型是数组型
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [3, 3, 3]])

3.concatenate()

c = np.concatenate([a,b],axis = 0)
print(c)
#输出,类型是数组型
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [3, 3, 3]])

3.3.2数组纵向合并,按列

1.np.hstack()

c = np.hstack((a,b))
print(c)
#输出,类型是数组型
array([[1, 2, 3, 7, 8, 9],
       [4, 5, 6, 3, 3, 3]])

2.np.c_[ ]

c = np.c_[a,b]
print(c)
#输出,类型是数组型
array([[1, 2, 3, 7, 8, 9],
       [4, 5, 6, 3, 3, 3]])

3.concatenate()

c = np.concatenate([a,b],axis = 1)
print(c)
#输出,类型是数组型
array([[1, 2, 3, 7, 8, 9],
       [4, 5, 6, 3, 3, 3]])

3.4python合并数组,pandas库

3.4.1 merge函数

参数

描述

left

参与合并的左侧DataFrame

right

参与合并的右侧DataFrame

how

连接方式:inner,默认;outer,left,right

on

连接的列名,和sql连接的on类似

left_on

左侧DF用作连接的键

right_on

右侧DF用作连接的键

left_index

将左侧的行索引用作其连接键

right_on

将右侧的行索引用作其连接键

sort

根据连接键对合并后的数据进行排序,默认True; 类似sql的order by

suffixes

字符串值元组,用于追加重叠列名的末尾,重叠列名重命名

copy

设置False,可以在某些特殊情况下避免将数据复制到结果数据结构中

import pandas as pd 
import numpy as np
df1 = pd.DataFrame({'key':['d','d','a','c'], 'data1':range(4)})
#out
   data1 key
0      0   d
1      1   d
2      2   a
3      3   c
df2 = pd.DataFrame({'key':['a','b','c'], 'data2':range(3)})
#out
   data1 key
0      0   a
1      1   b
2      2   c

(1) 默认合并,key相同合并data

df3 = pd.merge(df1,df2)#等同于df1.merge(df2)
#out
   data1 key  data2
0      2   a      0
1      3   c      2

(2)内连接,取交集

df3 = df1.merge(df2,on = 'key', how = 'inner')
#out
   data1 key  data2
0      2   a      0
1      3   c      2

(3)外连接,取并集,并有NaN填充

df3 = df1.merge(df2, on = 'key', how = 'outer')
#out
   data1 key  data2
0    0.0   d    NaN
1    1.0   d    NaN
2    2.0   a    0.0
3    3.0   c    2.0
4    NaN   b    1.0

(4)左连接,左侧DataFrame取全部,右侧DataFrame取部分

df3 = df1.merge(df2, on = 'key', how = 'left')
#out
   data1 key  data2
0      0   d    NaN
1      1   d    NaN
2      2   a    0.0
3      3   c    2.0

(5)右连接,右侧DataFrame取全部,左侧DataFrame取部分

df3 = df1.merge(df2, on = 'key', how = 'right')
#out
   data1 key  data2
0    2.0   a      0
1    3.0   c      2
2    NaN   b      1

(6)如果左右侧DataFrame的连接键列名不一致,但是取值有重叠,可使用left_on、right_on来指定左右连接键

df3 = pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1': range(7)})
df4 = pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
df3.merge(df4,left_on = 'lkey',right_on = 'rkey',how = 'inner')
#out
   data1 lkey  data2 rkey
0      0    b      1    b
1      1    b      1    b
2      6    b      1    b
3      2    a      0    a
4      4    a      0    a
5      5    a      0    a

3.4.2 索引合并

当连接键位于索引中时,成为索引上的合并,可以通过merge函数,传入left_index、right_index来说明应该被索引的情况

left1 = pd.DataFrame({'key':['a','b','a','a','b','c'],'value': range(6)})
right1 = pd.DataFrame({'group_val':[3.5,7]},index = ['a','b'])
df = pd.merge(left1,right1,left_on = 'key',right_index = True)
#out 
  key  value  group_val
0   a      0        3.5
2   a      2        3.5
3   a      3        3.5
1   b      1        7.0
4   b      4        7.0

3.4.3 concat轴向连接

参数

描述

objs

对象(列表或字典),对象的数据类型是pandas,不可为空

axis

连接的轴,0是纵轴(行),1是横轴(列)

join

合并的方式,inner,outer(默认)

ignore

不保留连接轴上的索引,产生一组新的索引

s1 = pd.Series([0,1,2],index = ['a','b','c'])
s2 = pd.Series([2,3,4],index = ['c','f','e'])
s3 = pd.Series([4,5,6],index = ['c','f','g'])

(1)默认情况,并集,纵向连接

s4 = pd.concat([s1, s2, s3])
#out 
a    0
b    1
c    2
c    2
f    3
e    4
c    4
f    5
g    6
dtype: int64
s4 = pd.concat([s1, s2, s3],ignore_index = True)
#out
0    0
1    1
2    2
3    2
4    3
5    4
6    4
7    5
8    6
dtype: int64

(2)纵向取交集,注意该方法对对象表中有重复索引时失效

s4 = pd.concat([s1,s2,s3],axis = 1,join = 'inner')
#out
   0  1  2
c  2  2  4

(3)横向索引取并集,纵向索引取交集,注意该方法对对象表中有重复索引时失效

s4 = pd.concat([s1,s2,s3],axis = 1,join = 'outer')
#out
     0    1    2
a  0.0  NaN  NaN
b  1.0  NaN  NaN
c  2.0  2.0  4.0
e  NaN  4.0  NaN
f  NaN  3.0  5.0
g  NaN  NaN  6.0

3.4.3 combine_first,重叠索引时填补缺失值

当两个对象的索引有部分或全部重叠时;
用参数对象中的数据为调用者对象的缺失数据‘打补丁’

a = pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index = ['a','b','c','d','e','f'])
#out
a    NaN
b    2.5
c    NaN
d    3.5
e    4.5
f    NaN
dtype: float64

b = pd.Series(np.arange(len(a)),index = ['a','b','c','d','e','f'])
#out
a    0
b    1
c    2
d    3
e    4
f    5

#用b填补a的空白
a.combine_first(b)
#a out 
a    0.0
b    2.5
c    2.0
d    3.5
e    4.5
f    5.0

4.pyhton 一个语句可以分成多行吗?

可以。如果有括号(小括号、中括号、大括号),敲回车键即可断行;
如果没有,需要在断开的地方加 \ 符号,表示这一行尚未结束
#例1.有括号
a = (alpha + beta +
charlie)
#例2.无括号
a = alpha + beta + \
charlie