将列追加到熊猫数据框


104

这可能很容易,但是我有以下数据:

在数据框1中:

index dat1
0     9
1     5

在数据框2中:

index dat2
0     7
1     6

我想要一个具有以下形式的数据框:

index dat1  dat2
0     9     7
1     5     6

我尝试使用该append方法,但是得到了交叉连接(即笛卡尔积)。

什么是正确的方法?


2
你尝试过这种join方法吗?
BrenBarn

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@lowtech:是否可以确保索引正确配对?
BenDundee

@BenDundee:是的
lowtech

Answers:


131

通常看来,您只是在寻找联接:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
或者pd.concat([dat1, dat2], axis=1)在这种情况下。
DSM 2013年

2
@BenDundee Join和concat在幕后使用了大量相同的代码,因此“正确”的方法仅在考虑边缘情况时才重要。例如,在这里,如果两个DataFrames都有一个“ data”列,则连接将失败,而concat将为您提供两个名为“ data”的列。
U2EF1 2013年

@ U2EF1:我说的是您对我的回应。总是有N种给猫皮的方法:)
BenDundee 2013年

@BenDundee我明白了。但是,该方法会丢弃唯一索引,并且在更复杂的情况下甚至会产生怪异的副作用。例如,如果我有两个名为“数据”的列,则分组/求和将开始对不同的数据列求和,这几乎肯定不是您想要的。字符串数据将被串联。
U2EF1

1
正如@ jeremy-z所指出的,如果两个数据集的索引不共享相同,则重置它们非常重要。否则,您将获得一个包含大量NaNs行的数据集。
以色列瓦雷亚


40

两者join()concat()方法都可以解决问题。但是,我不得不提一个警告:在您之前join()或者concat()如果您试图通过从另一个DataFrame中选择一些行来处理某个数据框架,请重置索引。

下面的一个示例显示了join和concat的一些有趣行为:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

说的好点。我尝试不重置索引就产生了很多NULL
Anand

如果不执行重置步骤,我的数据看起来很好,但是很明显,某些事情在后台运行得不好。感谢您指出!重置使我的模型启动并运行!
Ionuț Ciuta

这应该是公认的答案!如果不重置索引,它将始终生成NaN。
Srivatsan

这一步救了我。我试图了解为什么concat和join都会抛出很多NaN。感谢分享。
Gustavo Rottgering


-3

只是正确的Google搜索问题:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.