python - Pandas 数据帧 : merge files by common columns

标签 python pandas dataframe

我有一个文件集合,其中有一些我想要加入的常见列。在我的实际问题中,有几个不同和共同的列。在此玩具示例中,我有一组 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

最佳答案

有两个步骤:

首先,将所有相同类型的文件连接到一个 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']]

关于python - Pandas 数据帧 : merge files by common columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53355702/

相关文章:

r - 是否有一个滞后函数可以在数据帧的每一行上重新定义自身

python - 使用滚动窗口从数据帧创建 "buffer"矩阵?

r - 给定一个带有 A 列的 R 数据框,如何创建两个包含 A 的所有有序组合的新列

python - 反转字符串的就地递归解决方案

python - 在 python pandas 中将多个年份列转换为单个年份列(整洁格式)

Python Pandas 发现两个分布之间的统计差异

python - 如何从 csv 绘制 Bokeh 多行数据框

python - 安装pycurl时出现"Could not run curl-config: [Errno 2] No such file or directory"

python - TensorFlow Python 脚本被杀死

python - 无法使用 wtforms、append_entry() 和 FieldList(FormField()) 更改动态添加的表单字段的标签