作为R用户,我可以操作data.table中的列来派生一组新列,使用pandas datafframes实现此目的的最佳方法是什么?
这是一个可重现的例子(我使用的是R 3.2.5和Python 3.6):
R代码:
library(data.table)
df = data.table(iris)
df[,.(ratio1 = Sepal.Length/Sepal.Width, ratio2 = Petal.Length/Petal.Width)]
df[,.(ratio1 = Sepal.Length/Sepal.Width, ratio2 = Petal.Length/Petal.Width)]
最后一个命令将返回:
> df[,.(ratio1 = Sepal.Length/Sepal.Width, ratio2 = Petal.Length/Petal.Width)]
ratio1 ratio2
1: 1.457143 7.000000
2: 1.633333 7.000000
3: 1.468750 6.500000
4: 1.483871 7.500000
5: 1.388889 7.000000
---
146: 2.233333 2.260870
147: 2.520000 2.631579
148: 2.166667 2.600000
149: 1.823529 2.347826
150: 1.966667 2.833333
Python代码:
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
pd.DataFrame(list(df.apply(lambda x: {'ratio1':x['sepal length (cm)']/x['sepal width (cm)'], 'ratio2':x['petal length (cm)']/x['petal width (cm)']}, axis=1)))
最后一个命令将返回:
In[6]: pd.DataFrame(list(df.apply(lambda x: {'ratio1':x['sepal length (cm)']/x['sepal width (cm)'], 'ratio2':x['petal length (cm)']/x['petal width (cm)']}, axis=1)))
Out[6]:
ratio1 ratio2
0 1.457143 7.000000
1 1.633333 7.000000
2 1.468750 6.500000
3 1.483871 7.500000
4 1.388889 7.000000
5 1.384615 4.250000
这是我的问题:我的Python实现让我觉得效率低下。我正在计算一系列字典,将其投影到列表然后调用DataFrame构造函数。换句话说,它不是从数据帧到数据帧的直接操作。这翻译在详细代码中:R片段的最后一行是76个字符,Python的最后一行是158。
有一个更好的方法吗?谢谢!
附:请注意,我不想将派生列(ratio1,示例中的ratio2)永久添加到原始数据集。我想在运行中计算一些东西并绘制或聚合它而不改变数据。
只是一个鲜为人知的宝石来完成这样的事情,尝试以下内容:
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
# replace spaces and parentheses in column names:
df.columns = [col.replace(" (cm)", "").replace(" ", "_") for col in df.columns]
现在,使用pandas eval
方法提供的多行评估:
df.eval("""ratio1 = sepal_length/sepal_width
ratio2 = petal_length/petal_width""")
你不需要list()
或apply()
方法:
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
pd.DataFrame({"ratio1": df['sepal length (cm)']/df['sepal width (cm)'], "ratio2": df['petal length (cm)']/df['petal width (cm)']})
如果您希望将变量添加到原始数据集中,则可以使用assign()
方法。