【问题标题】:pandas: reshape and group row data into column datapandas:重塑行数据并将其分组为列数据
【发布时间】:2016-05-20 09:50:19
【问题描述】:

我有一个曾经是数据库格式的数据框(不是我的选择),这可以从本示例中对行而非列的关注中得到证明。

 df = pd.DataFrame([['John','Sept',1,'Dec',2],['Jane','Sept',1,'Dec',3],['James','Sept',2,'Dec',2]],columns=['Name','Test 1','Score 1','Test 2','Score 2'])

   Name Test 1  Score 1 Test 2  Score 2
0   John   Sept        1    Dec        2
1   Jane   Sept        1    Dec        3
2  James   Sept        2    Dec        2

我想把它转换成这种格式。

    Name  Test  Date  Score
0    Joe     1  Sept      1
1    Joe     2   Dec      2
3   Jane     1  Sept      1
4   Jane     2   Dec      3
6  James     1  Sept      2
7  James     2   Dec      2

所以基本上我想合并测试列,以便它们在名称列上分组。到目前为止,我已经查看了 melt() 和 unstack(),这让我得到了我想要的东西:

melt = pd.melt(df,id_vars=['Name','1st Test'])

    Name Test 1 variable value
0   John   Sept  Score 1     1
1   Jane   Sept  Score 1     1
2  James   Sept  Score 1     2
3   John   Sept   Test 2   Dec
4   Jane   Sept   Test 2   Dec
5  James   Sept   Test 2   Dec
6   John   Sept  Score 2     2
7   Jane   Sept  Score 2     3
8  James   Sept  Score 2     2

我很确定 groupby、melt 或 unstack 都能让我到达那里,但我就是无法正确使用语法。建议将不胜感激。

背景:我认为(我希望)这种新格式可以让我绘制分数变化与测试时间的关系。

【问题讨论】:

  • 配对样本 t 检验在原始格式中会容易得多,它只是 scipy.stats.ttest_rel(df['Score 1'], df['Score 2'])
  • 谢谢,我会调查的!不幸的是,这些人不想要 t 检验,他们想要用 Excel 制作的漂亮图表,以便以后使用,而当前的格式似乎对 Excel 不是特别友好。

标签: python pandas


【解决方案1】:

您可以将lreshapesort_values 一起使用:

df['T1'] = 1
df['T2'] = 2

df = (pd.lreshape(df, {'Test': ['T1', 'T2'],
                       'Date': ['Test 1', 'Test 2'], 
                       'Score': ['Score 1', 'Score 2']}))

#reorder columns, sort dataframe by Name
df = df[['Name','Test','Date','Score']].sort_values('Name', ascending=False)
print (df)

    Name  Test  Date  Score
0   John     1  Sept      1
3   John     2   Dec      2
1   Jane     1  Sept      1
4   Jane     2   Dec      3
2  James     1  Sept      2
5  James     2   Dec      2

pd.lreshape没有很好的文档记录,但您可以使用:

In [95]: help (pd.lreshape)

In [96]: Help on function lreshape in module pandas.core.reshape:

lreshape(data, groups, dropna=True, label=None)
    Reshape long-format data to wide. Generalized inverse of DataFrame.pivot

    Parameters
    ----------
    data : DataFrame
    groups : dict
        {new_name : list_of_columns}
    dropna : boolean, default True

    Examples
    --------
    >>> import pandas as pd
    >>> data = pd.DataFrame({'hr1': [514, 573], 'hr2': [545, 526],
    ...                      'team': ['Red Sox', 'Yankees'],
    ...                      'year1': [2007, 2008], 'year2': [2008, 2008]})
    >>> data
       hr1  hr2     team  year1  year2
    0  514  545  Red Sox   2007   2008
    1  573  526  Yankees   2007   2008

    >>> pd.lreshape(data, {'year': ['year1', 'year2'], 'hr': ['hr1', 'hr2']})
          team   hr  year
    0  Red Sox  514  2007
    1  Yankees  573  2007
    2  Red Sox  545  2008
    3  Yankees  526  2008

    Returns
    -------
    reshaped : DataFrame

【讨论】:

    【解决方案2】:

    可能有一些方法可以使用这些函数,但您可以不使用它们,而是将其拆分为两个数据帧,然后使用 append() 将它们堆叠起来。

    df = pd.DataFrame([['John','Sept',1,'Dec',2],['Jane','Sept',1,'Dec',3],['James','Sept',2,'Dec',2]],columns=['Name','Test 1','Score 1','Test 2','Score 2'])
    
    # split off frame 1
    df1 = df.loc[:,['Name','Test 1','Score 1']]
    df1.columns = ['Name','Date','Score']
    df1['Test'] = 1
    df1
    Out[4]:
    Name    Date    Score   Test
    John    Sept    1       1
    Jane    Sept    1       1
    James   Sept    2       1
    
    # split off frame 2
    df2 = df.loc[:,['Name','Test 2','Score 2
    df2 = df.loc[:,['Name','Test 2','Score 2']]
    df2.columns = ['Name','Date','Score']
    df2['Test'] = 2
    df2
    Out[5]:
    Name    Date    Score   Test
    John    Dec     2       2
    Jane    Dec     3       2 
    James   Dec     2       2
    
    # combine the two frames
    df = df1.append(df2)
    df.sort_values('N
    df = df1.append(df2)
    df.sort_values('Name')
    Out[6]:
    Name    Date    Score   Test
    James   Sept    2       1
    James   Dec     2       2
    Jane    Sept    1       1
    Jane    Dec     3       2
    John    Sept    1       1
    John    Dec     2       2
    

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 2023-02-13
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      相关资源
      最近更新 更多