python - 连接数据框会创建太多列
问题描述
我正在使用循环读取许多 csv 文件,它们都有 38 列。我将它们全部添加到列表中,然后连接/创建一个数据框。我的问题是,尽管所有这些 csv 文件都有 38 列,但我生成的数据框最终还是有 105 列。
这是一个屏幕截图:
如何使生成的数据框具有正确的 38 列并将所有行堆叠在一起?
import boto3
import pandas as pd
import io
s3 = boto3.resource('s3')
client = boto3.client('s3')
bucket = s3.Bucket('alpha-enforcement-data-engineering')
appended_data = []
for obj in bucket.objects.filter(Prefix='closed/closed_processed/year_201'):
print(obj.key)
df = pd.read_csv(f's3://alpha-enforcement-data-engineering/{obj.key}', low_memory=False)
print(df.shape)
appended_data.append(df)
df_closed = pd.concat(appended_data, axis=0, sort=False)
print(df_closed.shape)
解决方案
TLDR ; 检查您的列标题。
c = appended_data[0].columns
df_closed = pd.concat([df.set_axis(
c, axis=1, inplace=False) for df in appended_data], sort=False)
发生这种情况是因为您的列标题不同。当垂直连接时,Pandas 将在标题上对齐您的 DataFrame,并为不存在该标题的 DataFrame 插入空列。这是一个说明性示例:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df
A B
0 1 4
1 2 5
2 3 6
df2
C D
0 7 10
1 8 11
2 9 12
pd.concat([df, df2], axis=0, sort=False)
A B C D
0 1.0 4.0 NaN NaN
1 2.0 5.0 NaN NaN
2 3.0 6.0 NaN NaN
0 NaN NaN 7.0 10.0
1 NaN NaN 8.0 11.0
2 NaN NaN 9.0 12.0
创建 4 列。然而,你只想要两个。尝试,
df2.columns = df.columns
pd.concat([df, df2], axis=0, sort=False)
A B
0 1 4
1 2 5
2 3 6
0 7 10
1 8 11
2 9 12
哪个按预期工作。
推荐阅读
- go - 从子文件夹导入函数
- python - 如何在 python 中有效地存储、检查包含和检索大量浮点数?
- ios - 使用 Rect Native RNIAP 包启动 App Store 应用内购买对话框为时已晚
- algorithm - Google Kickstart Round A 2021-Rabbit House
- ibm-midrange - 基于条件的命令参数填写提示
- amazon-web-services - 在本地运行由 cdk 创建的嵌套堆栈
- spring-boot - Heroku Spring boot buildpack 映像应用程序未启动
- c# - 添加大参数时,ado.net 更新语句超时
- react-native - 从 expo cli 弹出以响应本机 cli 时遇到错误
- java - 坑 >> 信息:小黄人:下午 3:10:40 坑 >> 信息:找到 0 个测试