将特定的选定列作为副本提取到新DataFrame

我有一个4列的pandas DataFrame,我想创建一个 DataFrame,其中只有有3列。这个问题类似于:从数据帧中提取特定的列,但对于pandas而不是r。下面的代码不起作用,会引发一个错误,并且肯定不是熊猫的方法。

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

熊猫式的做法是什么?

910106 次浏览

有一种方法来做这个实际上它看起来和R相似

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

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

另一种方法是使用filter,它将默认创建一个副本:

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

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

new = old.drop('B', axis=1)

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

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

,其中old.column_name将给你一个系列。 列出所有想要保留的列系列,并将其传递给DataFrame构造函数。我们需要做一个转置来调整形状。< / p >

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]:
A   B    C
0  4  10  100
1  5  20   50

泛函形式

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

针对你上面的问题

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

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

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

返回相同的数据框架

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

最简单的方法是

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

按索引排列的列:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy()

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

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]

你可以删除索引中的列:

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

作为替代:

new = pd.DataFrame().assign(A=old['A'], C=old['C'], D=old['D'])