总结差别:
def merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
参数 | 说明 |
---|---|
left与right | 两个不同的DataFrame |
how | 指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner,连接时没有就以NaN填充 |
on | 指的是用于连接的列索引名称。必须存在左右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键 |
left_on | 左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。 |
right_on | 右则DataFrame中用作 连接键的列名 |
left_index | 使用左则DataFrame中的行索引做为连接键 |
right_index | 使用右则DataFrame中的行索引做为连接键 |
sort | 默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能 |
suffixes | 字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’,’_y’) |
copy | 默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能 |
indicator | 在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both) |
df1 = pd.DataFrame(
{'key1':list('abcdefgh'),
'data1':np.random.randint(-5,10,8)}
)
df2 = pd.DataFrame(
{'key2':list('abcde'),
'data2':np.random.randint(-5,10,5)}
)
# 两表合并 根据on参数相同的值合并,如果不指定默认根据相同的列合并
# print(pd.merge(df1,df2, on='key', suffixes=['左表', '右表'])) # suffixes指定后缀
# 如果两张表没有相同的列的时候,可以通过left_on和right_on来指定连接条件(列)
print(pd.merge(df1,df2, left_on='key1', right_on='key2'))
# 参数how默认是inner也就是内联,如果outer就是并集,没有就以NaN填充
print(pd.merge(df1,df2, left_on='key1', right_on='key2', how='outer'))
# 左连接和右连接,意思是以左为准或者是以右为准
print('#####################')
print(pd.merge(df1,df2, left_on='key1', right_on='key2', how='left'))
print(pd.merge(df1,df2, left_on='key1', right_on='key2', how='right'))
# 行索引
print(pd.merge(df1,df2, left_on='data1', right_index=True))
join 拼接列,主要用于索引上的合并
join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):
其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left
这个比较简单:
def concatenate(arrays, axis=None, out=None):
def concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
sort=None, copy=True):
参数 | 说明 |
---|---|
objs | 要合并的对象,可迭代对象元组或列表都可 |
axis | 默认为0按照列索引合并,为1时按照行索引合并 |
join | 默认为outer也就是并集,inner为交集 |
sort | 默认为True,设为False减少消耗,pandas0.24版本会提示 |
join_axes=[] | 指定自定义索引。 |
keys=[] | 创建层次化索引 |
ignore_index=True | 重建索引。 |
df1 = pd.DataFrame(
{'key1':list('abcdefgh'),
'data1':np.random.randint(-5,10,8)}
)
df2 = pd.DataFrame(
{'key2':list('abcde'),
'data1':np.random.randint(-5,10,5)}
)
print(pd.concat([df1,df2], sort=False))
0.24版本之后pandas.groupby()方法已经删除了,所以直接使用对象的groupby方法即可
def groupby(self, by=None, axis=0, level=None, as_index=True, sort=True,
group_keys=True, squeeze=False, observed=False, **kwargs):
df1 = pd.DataFrame(
{'key1':list('11223344'),
'data1':np.random.randint(-5,10,8),
'data2':np.random.randint(0,10,8),}
)
# print(pd.DataFrame.groupby())
print(df1.groupby('key1')) # 分组之后返回分组对象
gr_obj = df1.groupby('key1')
# 可以用函数进一步处理,计算过程中非数字的数据不参与计算
print(gr_obj.sum())
for name,data in group_obj:
print('#############')
print(name)
print(data)
print(list(group_obj))
print(dict(list(group_obj)))
展示:
[('1', key1 data1 data2
0 1 -2 7
1 1 -5 8), ('2', key1 data1 data2
2 2 0 5
3 2 -2 2), ('3', key1 data1 data2
4 3 3 5
5 3 -2 7), ('4', key1 data1 data2
6 4 3 1
7 4 -5 4)]
{'1': key1 data1 data2
0 1 -2 7
1 1 -5 8, '2': key1 data1 data2
2 2 0 5
3 2 -2 2, '3': key1 data1 data2
4 3 3 5
5 3 -2 7, '4': key1 data1 data2
6 4 3 1
7 4 -5 4}
data1 ... data2
count mean std min 25% 50% ... std min 25% 50% 75% max
key1 ...
1 2.0 2.5 4.949747 -1.0 0.75 2.5 ... 4.242641 1.0 2.5 4.0 5.5 7.0
2 2.0 4.5 0.707107 4.0 4.25 4.5 ... 2.828427 5.0 6.0 7.0 8.0 9.0
3 2.0 2.0 7.071068 -3.0 -0.50 2.0 ... 4.242641 0.0 1.5 3.0 4.5 6.0
4 2.0 -0.5 6.363961 -5.0 -2.75 -0.5 ... 2.828427 3.0 4.0 5.0 6.0 7.0
[4 rows x 16 columns]
# 按key2索引
print(group_ky2.sum())
# 是按原始的行索引结构运算
print(group_ky2.transform('sum').add_prefix('key2_sum_'))
# 使用内置函数并取别名
print(group_obj.agg([('最大值', 'max'), 'min']))
输出:
data1 data2
最大值 最小值 最大值 最小值
key1
1 6 -3 8 6
2 8 3 5 3
3 2 1 4 2
4 -2 -3 7 7
def max_min(df_obj):
# 参数是dataframe对象
return df_obj.max()-df_obj.min()
def mean_func(df_obj):
return df_obj.mean()
# 简单的自定义函数
print(group_obj.agg([('最大差值', max_min),('均值', mean_func)]))
print(group_obj.agg(lambda x:x.max()-x.min()))
# 对指定列进行聚合函数运算,取别名也一样
print(group_obj.agg({'data1': [('最大值', 'max')], 'data2': 'min'}))