如何将 Pandas 数据框中的多列弹出到新的数据框中?

新手上路,请多包涵

假设我有以下内容:

 df = pd.DataFrame({'a':range(2), 'b':range(2), 'c':range(2), 'd':range(2)})

我想从数据框中“弹出”两列(“c”和“d”)到一个新的数据框中,在原始 df 中留下“a”和“b”。以下不起作用:

 df2 = df.pop(['c', 'd'])

这是我的错误:

 TypeError: '['c', 'd']' is an invalid key

除了执行以下操作之外,有谁知道快速、优雅的解决方案?

 df2 = df[['c', 'd']]
df3 = df[['a', 'b']]

我知道上面的代码输入起来并不 那么 乏味,但这就是发明 DataFrame.pop 的原因——在从数据库中弹出一列时为我们节省一个步骤。

原文由 Sean McCarthy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 496
2 个回答

这必须是一个两步过程(您 无法解决 这个问题,因为如前所述, pop 适用于单个列并返回一个系列)。

首先,切片 df (第 1 步),然后删除这些列(第 2 步)。

 df2 = df[['c', 'd']].copy()
df = df.drop(['c', 'd'], axis=1)

这是使用 pd.concat 的单行版本:

 df2 = pd.concat([df.pop(x) for x in ['c', 'd']], axis=1)

这仍然是一个两步过程,但您是在一行中完成的。

 df

   a  b
0  0  0
1  1  1

df2

   c  d
0  0  0
1  1  1

话虽如此,我认为允许 pop 采用类似列标题的列表是有价值的,适当地返回弹出列的DataFrame。这将是对 GitHub 的一个很好的功能请求,假设有人有时间写一个。

原文由 cs95 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个替代方案,但我不确定它是否比您原来的解决方案更优雅:

 df2 = pd.DataFrame([df.pop(x) for x in ['c', 'd']]).T
df3 = pd.DataFrame([df.pop(x) for x in ['a', 'b']]).T

输出:

 print(df2)
#   c  d
#0  0  0
#1  1  1

print(df3)
#   a  b
#0  0  0
#1  1  1

原文由 pault 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题