【问题标题】:Concatenating dataframes creates too many columns连接数据框会创建太多列
【发布时间】:2019-11-07 15:06:29
【问题描述】:

我正在使用循环读取许多 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)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    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
    

    按预期工作。

    【讨论】:

    • 完美,很有意义!谢谢
    猜你喜欢
    • 2016-02-19
    • 2014-07-25
    • 2021-10-03
    • 2021-10-18
    • 2019-11-20
    • 2019-09-13
    • 2013-03-31
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多