Pandas拼接DataFrame(excel, csv等文件)

文章目录

    • 拼接的依据
    • 大量数据拼接如何优化

简而言之,就是对pandas的DataFrame数据帧进行拼接。在这里我们只讨论二维数据的拼接。

  • 拼接是如何完成(拼接对齐的依据)
  • 二维拼接就一定存在维度的问题
  • 优化拼接过程中的内存问题
import numpy as np
import pandas as pd

拼接的依据

  • 创建数据集
df1 = pd.DataFrame(np.random.randn(4, 4), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randn(4, 3), columns=list('BDC'))
df1
A B C D
0 -0.079552 0.021487 -1.177114 2.019905
1 -0.292159 0.566075 0.326775 0.563015
2 -1.387190 -0.861855 -0.030383 0.252816
3 -1.884057 0.614856 1.055406 -0.624015
df2
B D C
0 0.523507 -0.143685 -1.207445
1 -0.225272 -1.256686 -1.460399
2 0.876716 1.217899 -0.426158
3 1.576739 -0.061772 -0.030403
  • 按照列对齐,拼接行,观察原则
'''
注意: [df1, df2]是可迭代对象
axis 指定拼接方向 0:沿着行
ignore_index : 舍弃原index索引
sort : 针对未来可能的参数,依据版本论

可以发现结果是依据columns的信息自动对齐
'''
pd.concat([df1, df2], axis=0, ignore_index=True, sort=False)
A B C D
0 -0.079552 0.021487 -1.177114 2.019905
1 -0.292159 0.566075 0.326775 0.563015
2 -1.387190 -0.861855 -0.030383 0.252816
3 -1.884057 0.614856 1.055406 -0.624015
4 NaN 0.523507 -1.207445 -0.143685
5 NaN -0.225272 -1.460399 -1.256686
6 NaN 0.876716 -0.426158 1.217899
7 NaN 1.576739 -0.030403 -0.061772
  • 创建数据集合并演示沿着列的拼接
df1 = pd.DataFrame(np.random.randn(4, 3), index=list('abcd'))
df2 = pd.DataFrame(np.random.randn(3, 3), index=list('dcb'))
df1
0 1 2
a 0.830014 0.666486 -1.689213
b 0.190307 0.239306 -0.758844
c 0.465666 -1.260316 1.129589
d -0.154036 -0.132200 -0.087592
df2
0 1 2
d 0.977880 -1.126099 1.025316
c 0.098958 0.477865 0.248520
b 0.383276 1.766770 -1.269369
pd.concat([df1, df2], axis=1, ignore_index=True, sort=False)
0 1 2 3 4 5
a 0.830014 0.666486 -1.689213 NaN NaN NaN
b 0.190307 0.239306 -0.758844 0.383276 1.766770 -1.269369
c 0.465666 -1.260316 1.129589 0.098958 0.477865 0.248520
d -0.154036 -0.132200 -0.087592 0.977880 -1.126099 1.025316

大量数据拼接如何优化

前面只有两个df(df1, df2),那么假如我们有10多个文件怎么办,思路就是用生成器或迭代器代替列表传递

简而言之省内存!

def df_setor(cols, num=5, size=(4, 4)):
    '''
    依据字符串cols定义列
    传递生成器的大小以及生成的数据帧的尺寸
    '''
    for i in range(num):
        yield pd.DataFrame(np.random.randn(*size), columns=list(cols))
pd.concat(df_setor('abcd'), ignore_index=True, sort=False, axis=0)
a b c d
0 0.718131 -0.617167 1.144343 -1.754598
1 1.410114 0.255490 1.662504 -2.220613
2 0.410838 0.501420 -1.036853 -1.460435
3 1.059776 0.450194 1.337234 3.354079
4 -1.441148 -1.144011 -0.737408 -0.774923
5 -0.363407 -0.131945 -0.911156 0.028065
6 -0.195810 -0.170748 -0.944033 -0.410388
7 0.810549 0.880356 0.266294 -1.010484
8 -1.009637 0.229784 0.533094 -1.930391
9 0.836998 -1.100835 0.110546 1.640246
10 0.949160 0.337113 -0.200562 0.417208
11 0.902957 -0.157827 -0.856930 -1.118187
12 1.262193 0.210502 -0.161656 -0.400297
13 0.855064 2.764489 -0.216139 1.352855
14 -0.239884 0.901647 -0.334645 0.249483
15 0.204528 0.503115 -0.555895 0.527286
16 -0.329092 1.683237 0.792648 -0.985505
17 0.715905 -1.202739 0.384973 1.586383
18 2.024929 0.558906 0.607574 0.832749
19 0.263679 -1.788293 -0.341326 2.257293

优秀的示例可以看另一篇文章Pandas实用的25个技巧

不足之处望留言指正!谢谢

你可能感兴趣的:(pandas小技巧)