【问题标题】:Append column to pandas dataframe将列附加到熊猫数据框
【发布时间】:2014-01-03 08:57:18
【问题描述】:

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

在数据框 1 中:

index dat1
0     9
1     5

在数据框 2 中:

index dat2
0     7
1     6

我想要一个格式如下的数据框:

index dat1  dat2
0     9     7
1     5     6

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

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

【问题讨论】:

  • 你试过join的方法了吗?
  • data_frame_1['dat2'] = data_frame_2['dat2']
  • @lowtech:这能确保索引正确配对吗?
  • @BenDundee:是的

标签: python pandas


【解决方案1】:

一般来说,您似乎只是在寻找加入:

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

【讨论】:

  • 在这种情况下是pd.concat([dat1, dat2], axis=1)
  • @BenDundee Join 和 concat 在后台使用了很多相同的代码,因此“正确”的方式可能只在您考虑边缘情况时才重要。例如,如果两个 DataFrame 都有一个“数据”列,则连接将 失败,而连接会为您提供两个名为“数据”的列。
  • @U2EF1:我说的是你的反应和我的反应。给猫剥皮总是有 N 种方法 :)
  • @BenDundee 我明白了。但是,该方法会丢弃唯一索引,并且在更复杂的情况下会产生更奇怪的副作用。例如,如果我有两列名为“数据”,分组/求和将开始总结不同的数据列,这几乎肯定不是你想要的。字符串数据将被连接起来。
  • 正如@jeremy-z 所指出的,如果两个数据集中的索引不共享相同的索引,那么重置它们非常重要。否则,您将获得一个包含许多 NaN 行的数据集。
【解决方案2】:

你也可以使用:

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

【讨论】:

  • 万一遇到InvalidIndexError: Reindexing only valid with uniquely valued Index objects ,可以使用:pd.concat([dat1.reset_index(), dat2], axis=1)
【解决方案3】:

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

【讨论】:

  • 说得好,说得好。我尝试不重置索引并生成了很多 NULLS
  • 如果不执行重置步骤,我的数据看起来很好,但显然有些东西在幕后效果不佳。感谢您指出!重置让我的模型启动并运行!
  • 这应该是公认的答案!如果我们不重置索引,它总是会生成 NaN 。
  • 这一步救了我。我试图理解为什么 concat 和 join 都会抛出很多 NaN。感谢分享。
  • 为什么我必须重置索引?我在没有重置索引的情况下尝试了它,它工作正常
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2017-06-13
    • 2019-01-14
    • 2019-10-22
    • 1970-01-01
    • 2021-09-24
    • 2022-11-25
    • 2020-05-21
    相关资源
    最近更新 更多