tsx81428 发表于 2023-7-19 21:50:25

【pandas小技巧】--读取多个文件

日常分析数据时,只有单一数据文件的情况其实很少见,更多的情况是,
我们从同一个数据来源定期或不定期的采集了很多数据文件;或者从不同的数据源采集多种不同格式的数据文件。
在这样的情况下,分析数据之前,需要将不同的数据集合并起来。
合并数据一般有两个维度,一是同构的数据集合并后行数增加;一是异构的数据集合并后列数增加。
1. 同构数据集

比如我们采集了3个不同年份的人口统计文件,分别为:
import pandas as pd

fp1 = "population1.csv"
df = pd.read_csv(fp1)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683341353458-80c23df0-d616-4787-a27d-1e6ec71c5ef4.png#averageHue=%23e4e4e4&clientId=ub231f76c-2548-4&from=paste&height=188&id=u9c35965b&originHeight=188&originWidth=339&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13447&status=done&style=stroke&taskId=uc8b30913-d4c8-4c18-9ce0-eb18b0a1d97&title=&width=339
import pandas as pd

fp2 = "population2.csv"
df = pd.read_csv(fp2)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683341424703-8524a495-cb97-48e9-ab4e-6dc0753cc719.png#averageHue=%23e4e4e4&clientId=ub231f76c-2548-4&from=paste&height=189&id=u59617841&originHeight=189&originWidth=334&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13549&status=done&style=stroke&taskId=u7c32a8f7-7b40-476f-aba1-4e52b84a27f&title=&width=334
import pandas as pd

fp3 = "population3.csv"
df = pd.read_csv(fp3)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683341448541-b03f7a2b-a4e0-48e6-8e7c-4692a329ca4b.png#averageHue=%23e4e4e4&clientId=ub231f76c-2548-4&from=paste&height=187&id=uf1451c66&originHeight=187&originWidth=335&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13839&status=done&style=stroke&taskId=ufe27c6f8-9fe0-4baa-b364-dbaa0e21b0a&title=&width=335
合并所有的数据集可以用 pd.concat 方法,不过一个一个文件读取之后再合并比较麻烦。
如果文件名称有规律的话(一般定期采集的数据集文件,文件名都有一定的规律),可以通过 glob 库(支持通配符匹配)来匹配所有数据文件。
然后利用python代码的灵活性一次合并所有的数据。
from glob import glob

files = sorted(glob("./population.csv"))
df = pd.concat((pd.read_csv(f) for f in files))
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683342118856-b0d3bd7e-8f87-4f45-adc1-de87c26ce169.png#averageHue=%23e5e5e5&clientId=ub231f76c-2548-4&from=paste&height=479&id=u6b6a6811&originHeight=479&originWidth=336&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36238&status=done&style=stroke&taskId=u7c41296c-b5f8-426c-b133-ab92b70dc1d&title=&width=336
这样合并之后,发现索引是有重复的,如果要保持索引的唯一性,可以在合并时指定 ignore_index=True。
df = pd.concat((pd.read_csv(f) for f in files), ignore_index=True)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683342247075-126c6a26-484b-4ae3-88ee-1caae2c0fa36.png#averageHue=%23e6e2e1&clientId=ub231f76c-2548-4&from=paste&height=478&id=uc8a4a35d&originHeight=478&originWidth=347&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36958&status=done&style=stroke&taskId=u332038b2-9831-4980-ae56-4f1231e968a&title=&width=347
2. 异构数据集

异构的数据集指数据结构不一样的数据,一般来自于不同的数据源。
比如:
import pandas as pd

fp1 = "population-total.csv"
df = pd.read_csv(fp1)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683342887872-7cb8b42b-1fab-4052-bb21-5ae115a5dcba.png#averageHue=%23e5e5e5&clientId=ub231f76c-2548-4&from=paste&height=185&id=u07cab0b3&originHeight=185&originWidth=181&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8140&status=done&style=stroke&taskId=u2e28c57b-72eb-450c-a272-3f0f450c5a6&title=&width=181
import pandas as pd

fp2 = "population-man.csv"
df = pd.read_csv(fp2)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683343081588-f3fbd67b-ac54-4d9c-9639-d164077c3bea.png#averageHue=%23e5e5e5&clientId=ub231f76c-2548-4&from=paste&height=186&id=u67900818&originHeight=186&originWidth=187&originalType=binary&ratio=1&rotation=0&showTitle=false&size=7860&status=done&style=stroke&taskId=u4e147c5d-2e72-4e99-a0a5-3a72c41a5cd&title=&width=187
import pandas as pd

fp3 = "population-woman.csv"
df = pd.read_csv(fp3)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683343103861-b595e1e8-168c-438d-bd37-cf65801389eb.png#averageHue=%23e5e5e5&clientId=ub231f76c-2548-4&from=paste&height=186&id=u6a0028a7&originHeight=186&originWidth=186&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8604&status=done&style=stroke&taskId=ue13d5760-10c9-4a3e-9262-57644e0ed6e&title=&width=186
合并的方式和前面按行合并类似,区别在于指定 axis=1。
from glob import glob

files = sorted(glob("./population-*.csv"))
df = pd.concat((pd.read_csv(f) for f in files), axis=1)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683343904046-03e6246c-928e-4c21-9fae-2b3cdc308af3.png#averageHue=%23e4d8d8&clientId=u5b1b1349-a066-4&from=paste&height=187&id=u54149bd7&originHeight=187&originWidth=471&originalType=binary&ratio=1&rotation=0&showTitle=false&size=18801&status=done&style=stroke&taskId=u60f994d2-3701-468a-bb96-3e38f2ed70f&title=&width=471
合并之后发现有重复的列,对于重复的行,可以简单的通过 drop_duplicates()方法来去重,
去除重复的列则需要一些技巧。
df = df.loc[:, ~df.columns.duplicated()]
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1683344890012-8fe16578-788d-4879-aa6d-976b0b98c0e1.png#averageHue=%23e4e4e4&clientId=u5b1b1349-a066-4&from=paste&height=184&id=uafc5bba3&originHeight=184&originWidth=333&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13526&status=done&style=stroke&taskId=u81807566-5bb4-4633-bff7-0105638559b&title=&width=333
这样就去除了重复的列,完成了异构数据集的合并。
3. 附录

本篇使用的示例数据可以通过下面的url下载:

[*]population1.csv:http://databook.top:8888/pandas-tricks/population1.csv
[*]population2.csv:http://databook.top:8888/pandas-tricks/population2.csv
[*]population3.csv:http://databook.top:8888/pandas-tricks/population3.csv
[*]population-total.csv:http://databook.top:8888/pandas-tricks/population-total.csv
[*]population-man.csv:http://databook.top:8888/pandas-tricks/population-man.csv
[*]population-woman.csv:http://databook.top:8888/pandas-tricks/population-woman.csv

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【pandas小技巧】--读取多个文件