合并未对齐的Pandas数据帧

2024-09-27 18:24:52 发布

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

我有大约100个csv文件。它们中的每一个都被写入到自己的pandas数据框中,然后再合并,最后写入数据库。在

每个csv文件包含1000行和816列。在

问题是:

每个csv文件包含816列,但并非所有列都包含数据。因此,一些csv文件未对齐-数据已向左移动,但列尚未删除。在

下面是一个虚构的例子:

CSV文件A(正确):

    Name    Age City
    Joe     18  London
    Kate    19  Berlin
    Math    20  Paris

CSV文件B(带有错误标记):

^{pr2}$

我想合并A和B,但我目前的解决方案导致了一个不一致。在

我不确定用SQL还是Python处理这个问题更容易,但我希望你们中的一些人能想出一个好的解决方案。在

当前合并数据帧的解决方案如下:

def merge_pandas(csvpaths):
    list = []
    for path in csvpaths:
        frame = pd.read_csv(sMainPath + path, header=0, index_col = None)
        list.append(frame)
    return pd.concat(list)

提前谢谢。在


Tags: 文件csv数据pathname数据库pandas解决方案
1条回答
网友
1楼 · 发布于 2024-09-27 18:24:52

对于这些类型的问题,一个通用的解决方案很可能是过火了。我们注意到,唯一可能的错误是,当一个值从属于它的位置写到左边的列时。在

如果您的问题比您给出的两列示例更复杂,为了方便起见,您应该有一个包含预期列类型的数组。在

types = ['string', 'int']

接下来,我会设置一个标记来识别缺陷:

^{pr2}$

脚本可以确定地检测到错误

在您的简单场景中,每当出现错误时,我们可以简单地检查第一列中的值。在

  • 如果是数字,忽略并继续(在第二个值上保留NaN
  • 如果是字符串,请向右移动

在你的小例子中,那将是

def checkRow(row):
    try:
        row['Age'] = int(row['Age'])
    except ValueError:
        row['City']= row['Age']
        row['Age'] = np.NaN
    return row

df.apply(checkRow, axis=1)

如果您有两个以上的列,请使用types变量进行迭代检查,以找出NaN所属的位置。在

脚本无法确定错误

例如,如果两个相邻的列都是字符串值。那样的话,你就完了。使用第二个标记保存这些列并手动执行。当然,您可以进行高级检查(它应该是城市名称,检查值是否是城市名称),但这可能是过火了,手动执行会更快。在

相关问题 更多 >

    热门问题