我的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
怎么做?
答案 0 :(得分:1)
您需要使用pivot
或set_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
使用mean
,sum
等集合函数或使用groupby
+ aggregate function
+ unstack
:
但如果得到:
DataError:无聚合的数字类型
它表示聚合的列Height
不是数字,因此使用astype
投射到int
或float
:
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