293

我有一个有 4 列的 pandas DataFrame,我想创建一个只有三列的DataFrame 。这个问题类似于:Extracting specific columns from a data frame but for pandas not R. 以下代码不起作用,引发错误,当然不是 pandasnic 的方法。

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator 

pandasnic 的做法是什么?

4

9 回答 9

566

有一种方法可以做到这一点,它实际上看起来类似于 R

new = old[['A', 'C', 'D']].copy()

在这里,您只需从原始数据框中选择所需的列并为它们创建一个变量。如果您想修改新的数据框,您可能希望使用.copy()来避免SettingWithCopyWarning.

另一种方法是使用filter默认情况下创建副本:

new = old.filter(['A','B','D'], axis=1)

最后,根据原始数据框中的列数,使用 a 表达这一点可能更简洁drop(默认情况下这也会创建一个副本):

new = old.drop('B', axis=1)
于 2016-01-08T17:51:14.147 回答
39

最简单的方法是

new = old[['A','C','D']]

.

于 2019-06-11T18:09:12.067 回答
15

另一种更简单的方法似乎是:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

哪里old.column_name会给你一个系列。列出要保留的所有列系列并将其传递给 DataFrame 构造函数。我们需要做一个转置来调整形状。

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50
于 2019-01-15T06:50:18.750 回答
13

按索引列:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
于 2019-09-24T09:05:44.943 回答
6

Generic functional form

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

Specific for your problem above

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)
于 2019-04-08T11:04:27.227 回答
5

据我所知,您在使用过滤器功能时不一定需要指定轴。

new = old.filter(['A','B','D'])

返回相同的数据框

new = old.filter(['A','B','D'], axis=1)
于 2019-06-11T17:45:51.643 回答
1

如果你想有一个新的数据框,那么:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]
于 2020-01-24T15:41:09.623 回答
0

作为备选:

new = pd.DataFrame().assign(A=old['A'], C=old['C'], D=old['D'])
于 2021-12-14T14:05:17.847 回答
0

您可以删除索引中的列:

df = pd.DataFrame({'A': [1, 1], 'B': [2, 2], 'C': [3, 3], 'D': [4, 4]})

df[df.columns.drop(['B', 'C'])]

或者

df.loc[:, df.columns.drop(['B', 'C'])]

输出:

   A  D
0  1  4
1  1  4
于 2021-10-25T23:17:01.153 回答