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