将特定的选定列作为副本提取到新的 DataFrame
Extracting specific selected columns to new DataFrame as a copy
我有一个有 4 列的 pandas DataFrame,我想创建一个 new DataFrame only 有三个列。这个问题类似于:Extracting specific columns from a data frame 但对于 pandas 不是 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 的方法是什么?
有一种方法可以做到这一点,它实际上看起来类似于 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 构造函数。我们需要做一个转置来调整形状。
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'])
returns 与
相同的数据帧
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'])
我有一个有 4 列的 pandas DataFrame,我想创建一个 new DataFrame only 有三个列。这个问题类似于:Extracting specific columns from a data frame 但对于 pandas 不是 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 的方法是什么?
有一种方法可以做到这一点,它实际上看起来类似于 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 构造函数。我们需要做一个转置来调整形状。
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'])
returns 与
相同的数据帧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'])