将某些列保留在pandas DataFrame中,删除其他所有内容

Mat*_*att 40 python pandas

说我有一个数据表

    1  2  3  4  5  6 ..  n
A   x  x  x  x  x  x ..  x
B   x  x  x  x  x  x ..  x
C   x  x  x  x  x  x ..  x
Run Code Online (Sandbox Code Playgroud)

我想减少它,以便我只有第3列和第5列删除所有其他并保持结构.我怎么能用熊猫做到这一点?我想我理解如何删除单个列,但我不知道如何保存一些选择并删除所有其他列.

And*_*den 68

如果您有列的列表,您可以选择以下列:

In [11]: df
Out[11]:
   1  2  3  4  5  6
A  x  x  x  x  x  x
B  x  x  x  x  x  x
C  x  x  x  x  x  x

In [12]: col_list = [3, 5]

In [13]: df = df[col_list]

In [14]: df
Out[14]:
   3  5
A  x  x
B  x  x
C  x  x
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的问题,即“df = df[cols_keep]”方法,是它创建了数据帧的一个切片。为了证明这一点,请参阅“df._is_copy”,它将记录父数据帧的弱引用。该切片可能会在后续操作中继续导致“SettingWithCopyWarning”。相比之下,`df.drop(columns=df.columns.difference(cols_keep), inplace=True)`则没有这样的问题。 (5认同)

unu*_*tbu 10

你可以重新分配新的价值,您的DataFrame,df:

df = df.loc[:,[3, 5]]
Run Code Online (Sandbox Code Playgroud)

只要没有其他参考原件DataFrame,旧的DataFrame将收集垃圾.

请注意,使用时df.loc,索引由标签指定.因此,上面35不是序数,它们代表列的标签名称.如果您希望按顺序索引指定列,请使用df.iloc.


cs9*_*s95 8

如何将某些列保留在pandas DataFrame中,删除其他所有内容?

该问题的答案与“如何删除pandas DataFrame中的某些列?”的答案相同。这是到目前为止提到的一些其他选项以及时间安排。

DataFrame.loc

一个简单的选择就是选择,如其他答案所述,

# Setup.
df
   1  2  3  4  5  6
A  x  x  x  x  x  x
B  x  x  x  x  x  x
C  x  x  x  x  x  x

cols_to_keep = [3,5]
Run Code Online (Sandbox Code Playgroud)

df[cols_to_keep]

   3  5
A  x  x
B  x  x
C  x  x
Run Code Online (Sandbox Code Playgroud)

要么,

df.loc[:, cols_to_keep]

   3  5
A  x  x
B  x  x
C  x  x
Run Code Online (Sandbox Code Playgroud)

DataFrame.reindexaxis=1'columns'(0.21+)

但是,reindex在最新版本中,您还指定了axis=1要删除的:

df.reindex(cols_to_keep, axis=1)
# df.reindex(cols_to_keep, axis='columns')

# for versions < 0.21, use
# df.reindex(columns=cols_to_keep)

   3  5
A  x  x
B  x  x
C  x  x
Run Code Online (Sandbox Code Playgroud)

在较旧的版本上,您也可以使用reindex_axisdf.reindex_axis(cols_to_keep, axis=1)


DataFrame.drop

另一种选择是通过以下drop方式选择列pd.Index.difference

# df.drop(cols_to_drop, axis=1)
df.drop(df.columns.difference(cols_to_keep), axis=1)

   3  5
A  x  x
B  x  x
C  x  x
Run Code Online (Sandbox Code Playgroud)

性能

在此处输入图片说明

在性能方面,这些方法大致相同。reindex对于较小的N,drop速度更快,而对于较大的N,速度更快。由于Y轴是对数,因此性能是相对的。

设置和代码

import pandas as pd
import perfplot

def make_sample(n):
    np.random.seed(0)
    df = pd.DataFrame(np.full((n, n), 'x'))
    cols_to_keep = np.random.choice(df.columns, max(2, n // 4), replace=False)

    return df, cols_to_keep 

perfplot.show(
    setup=lambda n: make_sample(n),
    kernels=[
        lambda inp: inp[0][inp[1]],
        lambda inp: inp[0].loc[:, inp[1]],
        lambda inp: inp[0].reindex(inp[1], axis=1),
        lambda inp: inp[0].drop(inp[0].columns.difference(inp[1]), axis=1)
    ],
    labels=['__getitem__', 'loc', 'reindex', 'drop'],
    n_range=[2**k for k in range(2, 13)],
    xlabel='N',   
    logy=True,
    equality_check=lambda x, y: (x.reindex_like(y) == y).values.all()
)
Run Code Online (Sandbox Code Playgroud)