csv 向DataFrame添加N个空列

nzk0hqpo  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(84)

我有一个50 gb的csv文件(500 k记录,30 k列),我需要转置到键值对。我计划以块的形式迭代文件,对于每个块,我将进行转置并附加到目标csv文件中。在遍历每个块时,我需要确保每个块都有所有的列名,以便转置正确工作。但是每个块的 Dataframe 大小不同(列计数不同)。我一直在尝试获取列名,并在填充空列后将其添加到每个dataframe块中,以确保大小一致。尝试concat dummy dataframe,但出现错误-NotImplementedError:只能将MultiIndex与MultiIndex或元组的Index联合,请尝试mi.to_flat_index().union(other)。
有什么建议来解决这个问题吗?

obj = s3.get_object(Bucket='bucket', Key = 'xyz.csv')
csv_header =  pd.read_csv(obj['Body'], nrows=1).columns
print(csv_header.size)
csv_iterator = pd.read_csv(obj['Body'], iterator=True, chunksize=1) 

for csv_chunk in csv_iterator:
    #chunk =csv_chunk.set_axis(csv_header,
    #                 axis=1,inplace=True)
    #chunk.to_csv('temp_raw.csv',mode = 'a')
    #chunk.columns(csv_header)
    #chunk = pd.concat([csv_chunk,csv_header],axis=1)
    #print(csv_chunk)
    #csv_chunk.columns = csv_header
    column_size = csv_header.size-csv_chunk.columns.size
    print(csv_chunk.columns.size)
    print(csv_chunk.shape)
    print(column_size)
    a=[]
    b=[]
    for j in range(0, column_size):
        b.append(None)
    #Append the column to each row.
    for i in range(0, 1):
        a.append(b)
    print(pd.DataFrame(a).shape)
    df=pd.DataFrame(csv_chunk)
    a=pd.DataFrame(a)
    print(df.index)
    print(a.index)
    chunk=pd.concat([df,a],axis = 1)
#     df = pd.concat([pd.DataFrame(csv_chunk),
#                                  pd.DataFrame(a)],axis =1)
#     chunk = pd.DataFrame(pd.concat([pd.DataFrame(csv_chunk),
#                                  pd.DataFrame(a)]
#                                 ,axis=1),columns=csv_header)
    #print(pd.DataFrame(a).size)
#     print(chunk.head(1))
#     print(csv_chunk.columns.size)
    chunk.to_csv('temp_source.csv',mode = 'a')
    out = pd.melt(chunk,
              id_vars=['eid'],
              value_vars=chunk.columns[1:])
    out.to_csv('temp_key_value.csv',mode='a')

尝试concat dummy对象,但出现错误-NotImplementedError:只能将MultiIndex与MultiIndex或元组的Index联合,请尝试mi.to_flat_index().union(other)。
有什么建议来解决这个问题吗?

z9gpfhce

z9gpfhce1#

关于你问题的标题,
df[np.arange(4)]=None将向预先存在的df Dataframe 添加N=4列:

import pandas as pd
import numpy as np

df = pd.DataFrame(columns = ['one','two'],
                  index = range(1))
df
   one  two
0  NaN  NaN

df[np.arange(4)]=None
df
   one  two     0     1     2     3
0  NaN  NaN  None  None  None  None

你可以在这里找到你喜欢的其他方式:How to add a new column to an existing DataFrame?
现在,你的转置和多索引因素,是不清楚的,因为缺乏MRVE在你的问题。从csv阅读

  • 目前还不清楚您是如何得到多索引的,这看起来是您遇到困难的原因。一个可以通过不首先生成多索引来删除的索引?但我们需要看到输入数据的代表性样本。
  • 同样不清楚的是,当阅读同一个csv时,不同块之间的列数是如何变化的。这是一个真实的的csv,还是一个看起来像csv的文本文件?

相关问题