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

Spe*_*er5 138 python pandas chained-assignment

我有一个包含4列的pandas DataFrame,我想创建一个只有三列的 DataFrame .这个问题类似于:从数据框中提取特定列,但是对于不是R的pandas.以下代码不起作用,引发错误,并且当然不是这种方式的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 
Run Code Online (Sandbox Code Playgroud)

什么是pandasnic方式呢?

joh*_*ase 266

有一种方法可以做到这一点,它看起来与R类似

new = old[['A', 'C', 'D']].copy()
Run Code Online (Sandbox Code Playgroud)

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

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

new = old.filter(['A','B','D'], axis=1)
Run Code Online (Sandbox Code Playgroud)

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

new = old.drop('B', axis=1)
Run Code Online (Sandbox Code Playgroud)

  • 如果只复制一列则需要注意:在`old [['A']] .copy()`中,需要双方括号来创建新的数据帧.请注意,`old ['A'].copy()`只会创建一个Series. (9认同)

sai*_*009 12

按索引列:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Run Code Online (Sandbox Code Playgroud)


Dim*_*kis 7

作为备选:

new = pd.DataFrame().assign(A=old['A'], C=old['C'], D=old['D'])
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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
Run Code Online (Sandbox Code Playgroud)

  • 有效,但如果 column_name 有特殊字符则无效。 (2认同)

小智 6

通用函数形式

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame
Run Code Online (Sandbox Code Playgroud)

针对您上面的问题

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)
Run Code Online (Sandbox Code Playgroud)


sti*_*att 6

最简单的方法是

new = old[['A','C','D']]
Run Code Online (Sandbox Code Playgroud)

  • 除非您显式调用 .copy() ,否则这不会进行复制 (4认同)
  • @Nguaial 未指定简单索引的行为。您不会知道您是否获得了副本或视图。有关更多详细信息,请参阅文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy (4认同)
  • 正如上面的评论中提到的,这将创建一个视图而不是副本。 (3认同)

小智 5

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

new = old.filter(['A','B','D'])
Run Code Online (Sandbox Code Playgroud)

返回相同的数据帧

new = old.filter(['A','B','D'], axis=1)
Run Code Online (Sandbox Code Playgroud)