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

时间:2018-03-16 21:11:04

标签: python pandas

假设我有以下内容:

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

我想" pop"从数据框中删除两列(' c'和' d')到一个新的数据帧,留下' a'和' b'落后于原来的df。以下不起作用:

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

这是我的错误:

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

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

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

我知道上面的代码不是 输入的繁琐,但这就是DataFrame.pop发明的原因 - 为我们从数据库中弹出一列时节省了一步。

2 个答案:

答案 0 :(得分:5)

这必须是一个两步过程(你不能解决这个问题,因为正如所提到的,pop适用于单个列并返回一个系列)。

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

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

这是使用pd.concat的丑陋替代品:

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

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

df

   a  b
0  0  0
1  1  1

df2

   c  d
0  0  0
1  1  1

答案 1 :(得分:2)

这是另一种选择,但我不确定它是否比原始解决方案更优雅:

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

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

输出:

public class Demo {

    String name;
    Map<String, String> mp = new HashMap<>();

    ...
    name = "MyName";
    mp.put("Book", "My book title");
    mp.put("Fruit", "Orange");
    ...

}