Python,重新排列pandas中的数据

时间:2017-07-21 12:55:11

标签: python pandas

我的pandas数据框包含3列:(a)名称(b)日期和(c)高度(cm)。在不同日期测量不同孩子(姓名)的身高。我希望将Date列分开,以便我可以在特定日期看到每个孩子的身高。

例如, 我们的数据是这样的:

df = pd.DataFrame({
"Name": ["b", "c", "a", "b", "a", "c","a", "b", "c"], 
"Date": ["1", "1", "1", "2", "2", "2","3", "3", "3"], 
"Height": ["10", "11", "12", "11", "14", "13","15", "12", "14"]

})

希望代表这样: enter image description here

怎么做?

2 个答案:

答案 0 :(得分:1)

您需要使用pivotset_index + unstack进行重塑:

df1 = df.pivot(index='Name', columns='Date', values='Height')
print (df1)
Date   1   2   3
Name            
a     12  14  15
b     10  11  12
c     11  13  14

df1 = df.set_index(['Name', 'Date'])['Height'].unstack(fill_value=0)
print (df1)
Date   1   2   3
Name            
a     12  14  15
b     10  11  12
c     11  13  14

但如果得到:

  

ValueError:索引包含重复的条目,无法重塑

列中有重复项创建了新的索引和列:

df = pd.DataFrame({
"Name": ["b", "b", "a", "b", "a", "c","a", "b", "c"], 
"Date": ["1", "1", "1", "2", "2", "2","3", "3", "3"], 
"Height": ["10", "11", "12", "11", "14", "13","15", "12", "14"]
})
print (df)
  Date  Height Name
0    1      10    b <-duplicate Date=1, Name=b
1    1      11    b <-duplicate Date=1, Name=b
2    1      12    a
3    2      11    b
4    2      14    a
5    2      13    c
6    3      15    a
7    3      12    b
8    3      14    c

然后需要pivot_table使用meansum等集合函数或使用groupby + aggregate function + unstack

但如果得到:

  

DataError:无聚合的数字类型

它表示聚合的列Height不是数字,因此使用astype投射到intfloat

df['Height'] = df['Height'].astype(int)

df1 = df.pivot_table(index='Name', 
                     columns='Date', 
                     values='Height', 
                     aggfunc='mean', fill_value=0)
print (df1)
Date     1   2   3
Name              
a     12.0  14  15
b     10.5  11  12
c      0.0  13  14

df1 = df.groupby(['Name', 'Date'])['Height'].mean().unstack(fill_value=0)
print (df1)
Date     1     2     3
Name                  
a     12.0  14.0  15.0
b     10.5  11.0  12.0
c      0.0  13.0  14.0

对于列添加reset_index + rename_axis

df1 = df1.reset_index().rename_axis(None, axis=1)
print (df1)
  Name     1     2     3
0    a  12.0  14.0  15.0
1    b  10.5  11.0  12.0
2    c   0.0  13.0  14.0

答案 1 :(得分:0)

你想要的是一个MultiIndex数据框,比如你有一个像这样的df:

df = pd.DataFrame({
    "Name": ["a", "b", "c", "a", "b", "c"], 
    "Date": ["1", "2", "3", "4", "5", "6"], 
    "Height": ["10", "15", "12", "14", "17", "13"]
})

您实际上可以按以下顺序将索引设置为名称和日期:

df.set_index(["Name", "Date"], inplace=True)

这产生了这个df:

          Height
Name Date       
a    1        10
b    2        15
c    3        12
a    4        14
b    5        17
c    6        13

此处Name和Date都是索引,因此您可以在Name列上使用.loc,以获取特定名称的日期和高度的df,例如:

df.loc["a"]

收率:

     Height
Date       
1        10
4        14