我有一组文件,这些文件具有一些我想加入的常见列。在我真正的问题中,有几个不同且通用的列。在这个玩具示例中,我有一组a
文件和一组b
文件,它们具有唯一的列并共享相同的c
列。
$ for ii in $(ls *.dat) ; do echo " "; echo $ii ; cat $ii ; done
a1.dat
a,c
4,8
1,10
2,3
a2.dat
a,c
1,2
3,4
b1.dat
b,c
2,8
2,10
1,3
b2.dat
b,c
.2,2
.8,4
我想浏览这些文件并将它们合并为一个数据框。到目前为止,这是我尝试过的。我合并了第一个文件,以确保收集了所有列名,然后合并其余文件。当我按“内部”合并时,将返回一个空的数据框。
$ cat s.py
import pandas as pd
dat = pd.DataFrame()
for ii in [1, 2]:
for jj in ['a', 'b']:
d = pd.read_csv('%s%i.dat' % (jj, ii))
if ii == 1: dat = pd.concat([dat, d])
else: dat = pd.merge(dat, d, how='outer')
print(dat)
$ Python s.py
a b c
0 4.0 NaN 8
1 1.0 NaN 10
2 2.0 NaN 3
3 NaN 2.0 8
4 NaN 2.0 10
5 NaN 1.0 3
6 1.0 NaN 2
7 3.0 NaN 4
8 NaN 0.2 2
9 NaN 0.8 4
这不是我想要的输出。我不知道如何才能更好地完成这项工作。所需的输出是
a b c
0 4.0 2.0 8
1 1.0 2.0 10
2 2.0 1.0 3
3 1.0 0.2 2
4 3.0 0.8 4
答案 0 :(得分:1)
有两个步骤:
首先,将所有相同类型的文件连接到一个DataFrame中:
df = {}
for k in ['a', 'b']:
df[k] = pd.concat([
pd.read_csv('%s%d.dat' % (k, i)) for i in [1, 2]
], axis=0)
然后在共享列'c'上进行合并联接,
result = df['a'].merge(df['b'], on='c')[['a', 'b', 'c']]
答案 1 :(得分:1)
首先合并所有 a 和 b 文件,然后将它们合并到列c中,例如:
import numpy as np
import pandas as pd
a1 = pd.DataFrame({
'a': [4,1,2],
'c': [8,10,3],
})
a2 = pd.DataFrame({
'a': [1,3],
'c': [2,4],
})
b1 = pd.DataFrame({
'b': [2,2,1],
'c': [8,10,3],
})
b2 = pd.DataFrame({
'b': [0.2,0.8],
'c': [2,4],
})
concat_df_a = pd.concat([a1,a2])
concat_df_b = pd.concat([b1,b2])
print(concat_df_b.merge(concat_df_a,on='c')[['a','b','c']])
a b c
0 4 2.0 8
1 1 2.0 10
2 2 1.0 3
3 1 0.2 2
4 3 0.8 4