合并不对齐的pandas数据框

0 投票
1 回答
983 浏览
提问于 2025-04-18 17:24

我有大约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(数据对不上):

    Name    Age    City
    Joe     18     London
    Kate    Berlin
    Math    20     Paris

我想把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)

提前谢谢大家。

1 个回答

1

对于这类问题,使用通用的解决方案可能会显得有些复杂。我们注意到,唯一可能出错的地方就是把一个值写到了它应该在的列的左边

如果你的问题比你给出的两个列的例子更复杂,你应该准备一个数组,里面包含你期望的列类型,这样会更方便。

types = ['string', 'int']

接下来,我会设置一个标记来识别错误:

df['error'] = 0
df.loc[df.City.isnull(), 'error'] = 1

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

在你简单的场景中,只要出现错误,我们可以简单地检查第一列的值。

  • 如果是数字,就忽略它,继续往下看(保持第二个值为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应该放在哪一列。

这个脚本不能确定地知道错误

举个例子,如果两个相邻的列都是字符串值,那就麻烦了。你需要用第二个标记来保存这些列,然后手动处理。当然,你也可以进行更高级的检查(比如应该是城市名称,检查这个值是否是城市名称),但这样可能会显得过于复杂,手动处理会更快。

撰写回答