将列附加到pandas数据帧

Ben*_*dee 84 python pandas

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

在数据框1中:

index dat1
0     9
1     5
Run Code Online (Sandbox Code Playgroud)

在数据框2中:

index dat2
0     7
1     6
Run Code Online (Sandbox Code Playgroud)

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

index dat1  dat2
0     9     7
1     5     6
Run Code Online (Sandbox Code Playgroud)

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

这样做的正确方法是什么?

U2E*_*EF1 105

一般来说,你只是在寻找一个联盟:

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

  • 或者在这种情况下`pd.concat([dat1,dat2],axis = 1)`. (31认同)
  • @BenDundee Join 和 concat 在幕后使用了很多相同的代码,所以“正确”的方式可能只有在您考虑边缘情况时才重要。例如,如果两个 DataFrame 都有一个“数据”列,则连接将*失败*,而连接会为您提供两个名为“数据”的列。 (3认同)
  • 正如@jeremy-z 所指出的,如果两个数据集中的索引不共享相同的索引,则重置它们非常重要。否则,您将获得一个包含大量 NaN 行的数据集。 (2认同)

Ell*_*hen 49

您还可以使用:

dat1 = pd.concat([dat1, dat2], axis=1)
Run Code Online (Sandbox Code Playgroud)


Jer*_*y Z 29

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ews 6

无论如何,也许太简单了......

dat1 = pd.DataFrame({'dat1': [9,5]})
dat2 = pd.DataFrame({'dat2': [7,6]})
dat1['dat2'] = dat2  # Uses indices from dat1
Run Code Online (Sandbox Code Playgroud)

结果:

    dat1  dat2
0     9     7
1     5     6
Run Code Online (Sandbox Code Playgroud)