Pandas 将元组作为行附加到数据帧

Pandas 将元组作为行附加到数据帧,pandas,append,row,tuples,Pandas,Append,Row,Tuples,我正在寻找一种将行添加到数据帧的解决方案。以下是我掌握的数据: 分组对象(通过将数据帧按月份和年份分组获得,即在该分组对象中,键为[month,year],值为该月份和年份中的所有行/日期) 我想提取所有的月份和年份组合,并将其放在一个新的数据框架中问题:当我迭代分组对象month时,行是一个元组,因此我将元组转换为一个列表,并使用append命令将其添加到数据帧中。而不是作为行添加: 1 2014 2 2014 3 2014 它被添加到一列中 0 1 1 2014 0 2 1 2014 0 3

我正在寻找一种将行添加到数据帧的解决方案。以下是我掌握的数据: 分组对象(通过将数据帧按月份和年份分组获得,即在该分组对象中,键为[month,year],值为该月份和年份中的所有行/日期)

我想提取所有的月份和年份组合,并将其放在一个新的数据框架中问题:当我迭代分组对象month时,行是一个元组,因此我将元组转换为一个列表,并使用append命令将其添加到数据帧中。而不是作为行添加: 1 2014 2 2014 3 2014 它被添加到一列中 0 1 1 2014 0 2 1 2014 0 3 1 2014

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

我尝试将元组转换为列表,然后尝试了其他各种方法,如旋转。输入将非常有用

以下是示例代码:

    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

执行groupby操作时,生成的多索引如下所示:

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'])
通常这就足够了,您不需要数据帧。如果您这样做,一种方法是:

In [21]: pd.DataFrame(index=g.grouper.result_index).reset_index()
Out[21]:
   month  year
0      1  2014
1      2  2014
我以为有办法得到这个,但想不起来了

如果您确实需要元组,可以使用
.values
到\u 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

如果只需要唯一的值,可以使用
drop\u duplicates

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

您最初将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

谢谢你,安迪。这似乎奏效了。我使用了R的dplyr包,这似乎比pandas更简单、更直观,python pandas中有类似的包吗?我发现了一个名为pandas ply的软件包,但看起来他们仍在努力。你用过这个或类似的东西吗?@UdayShankar我不确定。我认为这让人觉得笨重的原因是,可能有一种更整洁的方式来做你正在做的任何事情——而不是进入内部。也可以执行
g.groups.keys()
来获取元组。谢谢chrisb,但在我的情况下,这可能不是我正在寻找的解决方案。