我有一个熊猫DataFrame 4列,我想创建一个新的DataFrame,只有三个列。这个问题类似于:从数据帧中提取特定的列,但对于熊猫而不是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
熊猫式的做法是什么?
另一种更简单的方法似乎是:
new = pd.DataFrame([old.A, old.B, old.C]).transpose()
老地方。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
你可以删除索引中的列:
df = pd.DataFrame({'A': [1, 1], 'B': [2, 2], 'C': [3, 3], 'D': [4, 4]})
df[df.columns.drop(['B', 'C'])]
or
df.loc[:, df.columns.drop(['B', 'C'])]
输出:
A D
0 1 4
1 1 4
有一种方法来做这个实际上它看起来和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)