【问题标题】:From R to Python: define multiple columns from multiple columns in a pandas dataframe从 R 到 Python:从 pandas 数据框中的多列定义多列
【发布时间】:2019-04-30 15:22:46
【问题描述】:

作为 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 sn-p 的最后一行是 76 个字符,Python 的最后一行是 158。

有没有更好的方法来做到这一点?谢谢!

附:请注意,我不想将派生列(示例中的 ratio1、ratio2)永久添加到原始数据集中。我想在不改变数据的情况下即时计算并绘制或聚合它。

【问题讨论】:

    标签: python r python-3.x pandas dataframe


    【解决方案1】:

    您不需要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() 方法。

    【讨论】:

      【解决方案2】:

      只是一个鲜为人知的宝石来完成这样的事情,试试以下:

      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""")
      

      请参阅文档 herehere

      【讨论】:

        猜你喜欢
        • 2017-03-28
        • 1970-01-01
        • 2016-11-06
        • 2016-12-29
        • 2022-10-13
        • 2019-01-10
        • 2019-10-29
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多