追加dataframe列的模式只会在datafram的第一行中创建值

2024-05-05 21:35:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在过去遇到一些损坏的csv文件后,我正在编写一个简单的python代码,该代码允许过滤掉这些错误行,以便我可以手动检查它们的模式,如果可能的话修复它们

然而,当我希望在文件中添加适当数量的列时,我只在第一行中观察到“mode”最频繁的分隔符,而不是所有行

如果一行的分隔符多于实际的列(例如,如果客户端的名称也有一个分隔符;然后excel也将其拆分,并将所有列向右移动一列)我希望加载到的每个数据块查看第一列中的分隔符数量将其与数据块的“右”分隔符数量进行比较(我使用一致模式简化此操作),然后将此错误行发送到列表中

我相信错误来自于我如何使用pandas,我对编码还不熟悉,虽然pandas似乎非常适合处理数据,但我仍在阅读大量关于如何正确处理列和行的内容

代码遍历了我的数百个csv文件,并基于一个绝对不常见的分隔符(在本例中为|)将它们分块加载。这将创建一个数据帧,其中我将整个csv行合并到一个字段中,从而允许我依次计算正确的分隔符(在本例中为;)

la=[]
for filename in all_files:
     for chunk in pd.read_csv(filename, sep='|', chunksize=1000000):
         chunk['filename'] = os.path.basename(filename)
         chunk["delimeters"] = chunk.iloc[:,0].str.count(',')
         chunk['good delimeter'] = chunk["delimeters"].mode()

         for index, row in chunk.iterrows():
             if row['delimeters'] != chunk['good delimeter']:
               la.append(row)
             else: 
               print("all good")


print(la) 

我目前的主要问题是,当我查看区块数据帧时,分隔符的计数工作得很好,但是模式仅附加到第一行,因此当我查看区块时,它看起来如下所示:

    Name| Filename| delimetier| good delimeter
    A     123       48         48
    B     123       48         Nan
    C     123       49         Nan
    D     123       48         Nan

但是,我希望将分隔符列的模式附加到all,以便可以将它们与if语句进行比较,从而过滤掉错误行

现在为本文运行此脚本时,我还遇到以下错误:

ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()

但是,我假设这是由Nan引起的后续错误


Tags: 文件csv数据代码for数量错误模式
1条回答
网友
1楼 · 发布于 2024-05-05 21:35:09

此行不是返回/分配标量值,而是一个numpy数组:

chunk['good delimeter'] = chunk["delimeters"].mode()

将其更改为:

chunk['good delimeter'] = chunk["delimeters"].mode()[0]

将模式值分配给类型为numpy.float64的所有行

相关问题 更多 >