【问题标题】:Create new reference dataframe创建新的参考数据框
【发布时间】:2016-05-12 14:20:01
【问题描述】:

从此(数据框)最简单的方法是什么:

Project Folder Owner value1 values2
  A       B      C     100    200
  A       B      C     500    400
  D       E      F     100    200
  D       E      F     300    400

到这里:

referenceID   value1 values2
  1             100    200
  1             500    400
  2             100    200
  2             300    400

和第二个数据框:

referenceID Project Folder Owner 
1             A       B      C
2             D       E      F

虽然我想使用标签编码器,但这需要我将“项目、文件夹和所有者”连接到一个新字段中——只要我保留原件就可以,但似乎是额外不必要的工作。

【问题讨论】:

    标签: python python-2.7 dataframe


    【解决方案1】:

    这将生成您正在寻找的输出。

    m = [['A', 'B', 'C', 100, 200],
         ['A', 'B', 'C', 500, 400],
         ['D', 'E', 'F', 100, 200],
         ['D', 'E', 'F', 300, 400]]
    
    owner = {}
    for row in m:
        key = tuple(row[:3])
        if key in owner:
            owner[key].append(row[3:])
        else:
            owner[key] = [row[3:]]
    
    frame1 = []
    frame2 = []
    for i, key in enumerate(owner):
        frame2.append([i] + list(key))
        for row in owner[key]:
            frame1.append([i] + list(row))
    
    
    print frame1
    print frame2
    

    【讨论】:

    • 我同意。但是您假设用户熟悉熊猫。我的解决方案只依赖于标准库。
    • 是的,我在问题上提到了数据框。顺便说一句,我没有给你投反对票
    【解决方案2】:

    您可以使用“项目”、“文件夹”和“所有者”在原始数据框上创建第二个带有 groupby 的数据框。然后创建索引的唯一值列表并将它们输入到新的数据框中。假设您的原始数据位于名为 df 的数据框中:

    df2 = df.groupby(['Project', 'Folder', 'Owner']).agg('sum')
    df3 = pd.DataFrame([list(df2.index.unique().tolist()[x]) for x in range(len(df2.index.unique().tolist()))], columns=df2.index.name)
    df3.insert(0, 'ReferenceId', df3.index + 1)
    

    结果将如下所示(您想要的第二个数据帧):

        ReferenceId Project Folder  Owner
    0   1           A       B       C
    1   2           D       E       F
    

    【讨论】:

      【解决方案3】:

      为了选择你的列,如果你知道列的编号,使用内置调用,否则使用.ix方法:

      %timeit df.loc[:,['value1','values2']]
      out: 1000 loops, best of 3: 602 µs per loop
      
      %timeit df[[3,4]]
      out: 1000 loops, best of 3: 295 µs per loop
      
      %timeit df.ix[:,['value1','values2']]
      1000 loops, best of 3: 412 µs per loop
      

      至于groupby,那就用groupby吧:

      df.groupby(['Project','Folder','Owner'],as_index = False).sum().drop(['value1','values2'],1)
      

      【讨论】:

      • referenceID 在哪里?以及如何用它更新原始数据框?
      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 2022-07-31
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2021-09-08
      • 2019-05-16
      相关资源
      最近更新 更多