合并不对齐的pandas数据框
我有大约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
应该放在哪一列。
这个脚本不能确定地知道错误
举个例子,如果两个相邻的列都是字符串值,那就麻烦了。你需要用第二个标记来保存这些列,然后手动处理。当然,你也可以进行更高级的检查(比如应该是城市名称,检查这个值是否是城市名称),但这样可能会显得过于复杂,手动处理会更快。