在Pandas数据框中添加列

158

这可能很简单,但我有以下数据:

在数据框架1中:

index dat1
0     9
1     5
在第二个数据框中:
index dat2
0     7
1     6

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

index dat1  dat2
0     9     7
1     5     6

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

应该如何正确操作?


3
你尝试使用join方法了吗? - BrenBarn
3
将data_frame_2中的'dat2'列赋值给data_frame_1中的'dat2'列。 - lowtech
@lowtech:这是否确保索引正确配对? - BenDundee
@BenDundee:是的,它确实可以。 - lowtech
6个回答

189

总的来说,你似乎只是在寻找一个联接(join):

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

73
在这种情况下,可以使用pd.concat([dat1, dat2], axis=1)进行连接。 - DSM
4
@BenDundee:join和concat在内部使用了很多相同的代码,因此“正确”的方法可能只有在考虑边缘情况时才更为重要。例如,在这里,如果两个DataFrame都有一个名为'data'的列,则join会失败,而concat会给您两个名为'data'的列。 - U2EF1
@U2EF1:我在谈论你的回复和我的回复。总有N种方法来解决问题 :) - BenDundee
@BenDundee 我明白了。那种方法会丢弃唯一索引,并在更复杂的情况下产生更奇怪的副作用。例如,如果我有两列名为“data”,分组/求和将开始对不同的数据列进行求和,这几乎肯定不是您想要的。字符串数据将被连接起来。 - U2EF1
3
如 @jeremy-z 所指出的,如果两个数据集的索引不相同,则需要在两个数据集中重置索引。否则,你将得到一个带有许多NaN行的数据集。 - Israel Varea
显示剩余2条评论

76

你也可以使用:

dat1 = pd.concat([dat1, dat2], axis=1)

1
如果你遇到了 InvalidIndexError: Reindexing only valid with uniquely valued Index objects 错误,你可以使用: pd.concat([dat1.reset_index(), dat2], axis=1) - beyondfloatingpoint

64

无论是使用join()还是concat()方法都可以解决这个问题。然而,我必须提醒一个警告:如果你试图从另一个DataFrame选择一些行来处理数据,则在使用join()concat()之前请重置索引。

下面的示例展示了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

说得好,观点很好。我尝试过不重置索引,结果生成了大量的NULLS。 - Anand
没有进行重置步骤,我的数据看起来很好,但显然幕后有些东西没有正常工作。感谢您指出这一点!重置让我的模型重新运行起来了! - Ionut Ciuta
这应该是被接受的答案!如果我们不重置索引,它总是会生成NaN。 - Srivatsan
这一步帮了我大忙。我一直在试图理解为什么concat和join会抛出很多NaN。感谢您分享这个。 - Gustavo Rottgering
为什么我必须重置索引?我尝试了不重置索引,它也可以正常工作。 - PeterBe

5
也许太简单了,但无论如何...
dat1 = pd.DataFrame({'dat1': [9,5]})
dat2 = pd.DataFrame({'dat2': [7,6]})
dat1['dat2'] = dat2  # Uses indices from dat1

结果:

    dat1  dat2
0     9     7
1     5     6

2
您可以分配新的列。使用索引来对齐相应的行:
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [10, 20, 30]}, index=[0, 1, 2])
df2 = pd.DataFrame({'C': [100, 200, 300]}, index=[1, 2, 3])

df1['C'] = df2['C']

结果:

   A   B      C
0  1  10    NaN
1  2  20  100.0
2  3  30  200.0

忽略索引:

df1['C'] = df2['C'].reset_index(drop=True)

结果:

   A   B    C
0  1  10  100
1  2  20  200
2  3  30  300

-8

只是一个正确的谷歌搜索问题:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接