将元组作为行附加到数据框

时间:2015-09-30 21:57:31

标签: pandas append row tuples

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

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

我想将这些值存储在新的数据框中。以下是我希望新数据帧的方式:      月份      2014年1月      2014年2月      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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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