【问题标题】:Append a tuple to a dataframe as a row将元组作为一行附加到数据框
【发布时间】:2015-12-28 20:10:56
【问题描述】:

我正在寻找一种将行添加到数据框的解决方案。这是我拥有的数据: 分组对象(通过按月和年对数据框进行分组获得,即在此分组对象中,键是 [月,年],值是该月和年中的所有行/日期)。

我想提取所有的月份、年份组合并将其放入一个新的数据框中。 问题:当我遍历分组对象时,月,行是一个元组,所以我将元组转换为一个列表,并使用你的追加命令将其添加到数据帧中。而不是添加为 rows : 1 2014 2 2014 3 2014 它被添加在一列中 0 1 1 2014 0 2 1 2014 0 3 1 2014 ...

我想将这些值存储在一个新的数据框中。这是我希望新数据框的样子: 月 年 1 2014 2 2014 3 2014

我尝试将元组转换为列表,然后尝试了其他各种操作,例如旋转。输入将非常有帮助。

这里是示例代码:

    df=df.groupby(['month','year'])
    df = pd.DataFrame()
    for key, value in df:
            print "type of key is:",type(key)
            print "type of list(key) is:",type(list(key))
            df = df.append(list(key))
    print df

【问题讨论】:

    标签: pandas append row tuples


    【解决方案1】:

    当您执行 groupby 时,生成的 MultiIndex 可用作:

    In [11]: df = pd.DataFrame([[1, 2014, 42], [1, 2014, 44], [2, 2014, 23]], columns=['month', 'year', 'val'])
    
    In [12]: df
    Out[12]:
       month  year  val
    0      1  2014   42
    1      1  2014   44
    2      2  2014   23
    
    In [13]: g = df.groupby(['month', 'year'])
    
    In [14]: g.grouper.result_index
    Out[14]:
    MultiIndex(levels=[[1, 2], [2014]],
               labels=[[0, 1], [0, 0]],
               names=['month', 'year'])
    

    这通常就足够了,而且您不需要 DataFrame。如果你这样做,一种方法如下:

    In [21]: pd.DataFrame(index=g.grouper.result_index).reset_index()
    Out[21]:
       month  year
    0      1  2014
    1      2  2014
    

    我以为有办法得到这个,但想不起来了。

    如果你真的想要元组,你可以使用.valuesto_series

    In [31]: g.grouper.result_index.values
    Out[31]: array([(1, 2014), (2, 2014)], dtype=object)
    
    In [32]: g.grouper.result_index.to_series()
    Out[32]:
    month  year
    1      2014    (1, 2014)
    2      2014    (2, 2014)
    dtype: object
    

    【讨论】:

    • 谢谢,安迪。这似乎奏效了。我使用了 R 的 dplyr 包,这似乎比 pandas 更容易和更直观,python pandas 中是否有类似的包?我找到了一个名为 pandas-ply 的包,但看起来他们仍在研究它。你用过这个或类似的东西吗?
    • @UdayShankar 我不确定。我认为这感觉笨拙的原因是可能有一种更简洁的方法来做你正在做的任何事情——而不需要进入内部。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
    • 也可以使用g.groups.keys() 来获取元组。
    【解决方案2】:

    您最初将 groupby 和空数据框都声明为 df。这是您的代码的修改版本,允许您将元组附加为数据框行。

    g=df.groupby(['month','year'])
    df = pd.DataFrame()
    for (key1,key2), value in g:
        row_series = pd.Series((key1,key),index=['month','year'])
        df = df.append(row_series, ignore_index = True)
    print df
    

    【讨论】:

      【解决方案3】:

      如果你想要的只是唯一值,你可以使用drop_duplicates

      In [29]: df[['month','year']].drop_duplicates()
      Out[29]: 
         month  year
      0      1  2014
      2      2  2014
      

      【讨论】:

      • 感谢 chrisb,但就我而言,这可能不是我正在寻找的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2023-02-25
      • 2021-05-29
      • 2018-02-13
      • 2018-07-15
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多