假设我有以下内容:
df = pd.DataFrame({'a':range(2), 'b':range(2), 'c':range(2), 'd':range(2)})
Run Code Online (Sandbox Code Playgroud)
我想从数据框中“弹出”两列(“ c”和“ d”)到一个新的数据框中,在原始df中保留“ a”和“ b”。以下内容不起作用:
df2 = df.pop(['c', 'd'])
Run Code Online (Sandbox Code Playgroud)
这是我的错误:
TypeError: '['c', 'd']' is an invalid key
Run Code Online (Sandbox Code Playgroud)
除了执行以下操作之外,还有谁知道快速,一流的解决方案?
df2 = df[['c', 'd']]
df3 = df[['a', 'b']]
Run Code Online (Sandbox Code Playgroud)
我知道上面的代码键入起来并不是那么繁琐,但这就是发明DataFrame.pop的原因-为我们节省了从数据库中弹出一列的步骤。
cs9*_*s95 11
这将是一个两步过程(您不能绕开它,因为正如正确提到的那样,它pop适用于单个列并返回一个Series)。
首先,切片df(步骤1),然后删除这些列(步骤2)。
df2 = df[['c', 'd']].copy()
del df[['c', 'd']] # df.drop(['c', 'd'], axis=1, inplace=True)
Run Code Online (Sandbox Code Playgroud)
这是使用的丑陋选择pd.concat:
df2 = pd.concat([df.pop(x) for x in ['c', 'd']], 1)
Run Code Online (Sandbox Code Playgroud)
这仍然是一个两步过程,但是您需要一行完成。
df
a b
0 0 0
1 1 1
df2
c d
0 0 0
1 1 1
Run Code Online (Sandbox Code Playgroud)
这是一个替代方案,但我不确定它是否比您原来的解决方案更优雅:
df2 = pd.DataFrame([df.pop(x) for x in ['c', 'd']]).T
df3 = pd.DataFrame([df.pop(x) for x in ['a', 'b']]).T
Run Code Online (Sandbox Code Playgroud)
输出:
print(df2)
# c d
#0 0 0
#1 1 1
print(df3)
# a b
#0 0 0
#1 1 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4743 次 |
| 最近记录: |