[英]Stacking Pandas Dataframe
我有以下pandas数据框,我在不同日期有NDVI值5个不同点 -
print (df)
>>>
PSC Intel
FID Lat Lon 23-May 18-May 25-May 28-May
0 51.62 -63.81 -0.04 0.08 0.10 0.13
1 51.62 -63.80 -0.05 0.09 0.10 0.13
2 51.62 -63.80 -0.05 0.08 0.07 0.12
3 51.62 -63.80 -0.06 0.08 0.11 0.14
4 51.62 -63.80 -0.05 0.09 0.11 0.16
但是,我需要将它们转换为堆叠NDVI值,并在那里添加一个新列来指示数据收集日期。 所需格式如下 -
FID Lat Lon NVAL Date SAT
0 51.62 -63.81 -0.04 23-May PSC
1 51.62 -63.80 -0.05 23-May PSC
2 51.62 -63.80 -0.05 23-May PSC
3 51.62 -63.80 -0.06 23-May PSC
4 51.62 -63.80 -0.05 23-May PSC
0 51.62 -63.81 0.08 18-May PSC
1 51.62 -63.80 0.09 18-May PSC
2 51.62 -63.80 0.08 18-May PSC
3 51.62 -63.80 0.08 18-May PSC
4 51.62 -63.80 0.09 18-May PSC
0 51.62 -63.81 0.10 25-May Inter
1 51.62 -63.80 0.10 25-May Inter
2 51.62 -63.80 0.07 25-May Inter
3 51.62 -63.80 0.11 25-May Inter
4 51.62 -63.80 0.11 25-May Inter
0 51.62 -63.81 0.13 28-May Inter
1 51.62 -63.80 0.13 28-May Inter
2 51.62 -63.80 0.12 28-May Inter
3 51.62 -63.80 0.14 28-May Inter
4 51.62 -63.80 0.16 28-May Inter
有没有办法使用熊猫或任何其他python库?
使用函数stack()
#Creating DataFrame
df=pd.DataFrame({'FID':[0,1,2,3,4],'Lat':[51.62,51.62,51.62,51.62,51.62],'Lon':[-63.81,-63.80,-63.80,-63.80,-63.80],'23-May':[-.04,-.05,-.05,-.06,-.05],'18-May':[0.08,0.09,0.08,0.08,0.09],'25-May':[.1,.1,.07,.11,.11],'28-May':[0.13,.13,.12,.14,.16]})
df=df[['FID','Lat','Lon','23-May','18-May','25-May','28-May']]
df
FID Lat Lon 23-May 18-May 25-May 28-May
0 0 51.62 -63.81 -0.04 0.08 0.10 0.13
1 1 51.62 -63.80 -0.05 0.09 0.10 0.13
2 2 51.62 -63.80 -0.05 0.08 0.07 0.12
3 3 51.62 -63.80 -0.06 0.08 0.11 0.14
4 4 51.62 -63.80 -0.05 0.09 0.11 0.16
df_stacked=df.set_index(['FID','Lat','Lon']).stack().reset_index()
df_stacked=df_stacked.rename(columns={'level_3':'Date',0:'Value'})
df_stacked=df_stacked[['FID','Lat','Lon','Value','Date']]
df_stacked
FID Lat Lon Value Date
0 0 51.62 -63.81 -0.04 23-May
1 0 51.62 -63.81 0.08 18-May
2 0 51.62 -63.81 0.10 25-May
3 0 51.62 -63.81 0.13 28-May
4 1 51.62 -63.80 -0.05 23-May
5 1 51.62 -63.80 0.09 18-May
6 1 51.62 -63.80 0.10 25-May
7 1 51.62 -63.80 0.13 28-May
8 2 51.62 -63.80 -0.05 23-May
9 2 51.62 -63.80 0.08 18-May
10 2 51.62 -63.80 0.07 25-May
11 2 51.62 -63.80 0.12 28-May
12 3 51.62 -63.80 -0.06 23-May
13 3 51.62 -63.80 0.08 18-May
14 3 51.62 -63.80 0.11 25-May
15 3 51.62 -63.80 0.14 28-May
16 4 51.62 -63.80 -0.05 23-May
17 4 51.62 -63.80 0.09 18-May
18 4 51.62 -63.80 0.11 25-May
19 4 51.62 -63.80 0.16 28-May
建立:
from io import StringIO
import pandas as pd
df = pd.read_table(StringIO("""FID Lat Lon 23-May 18-May 25-May 28-May
0 51.62 -63.81 -0.04 0.08 0.10 0.13
1 51.62 -63.80 -0.05 0.09 0.10 0.13
2 51.62 -63.80 -0.05 0.08 0.07 0.12
3 51.62 -63.80 -0.06 0.08 0.11 0.14
4 51.62 -63.80 -0.05 0.09 0.11 0.16"""), sep='\s+')
使用熔化 :
df = pd.melt(df,id_vars=['FID','Lat','Lon'], var_name='Date', value_name='Value')
输出: df[['FID','Lat','Lon','Value','Date']]
FID Lat Lon Value Date
0 0 51.62 -63.81 -0.04 23-May
1 1 51.62 -63.80 -0.05 23-May
2 2 51.62 -63.80 -0.05 23-May
3 3 51.62 -63.80 -0.06 23-May
4 4 51.62 -63.80 -0.05 23-May
5 0 51.62 -63.81 0.08 18-May
6 1 51.62 -63.80 0.09 18-May
7 2 51.62 -63.80 0.08 18-May
8 3 51.62 -63.80 0.08 18-May
9 4 51.62 -63.80 0.09 18-May
10 0 51.62 -63.81 0.10 25-May
11 1 51.62 -63.80 0.10 25-May
12 2 51.62 -63.80 0.07 25-May
13 3 51.62 -63.80 0.11 25-May
14 4 51.62 -63.80 0.11 25-May
15 0 51.62 -63.81 0.13 28-May
16 1 51.62 -63.80 0.13 28-May
17 2 51.62 -63.80 0.12 28-May
18 3 51.62 -63.80 0.14 28-May
19 4 51.62 -63.80 0.16 28-May
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.