我相信我的问题可以通过循环来解决,但我无法创建这样的循环。我有一个看起来像这样的数据样本 sample data
我想按年份组织数据框架: result data
我尝试通过创建带有df ['year'] = df.index.year的Year列,然后使用数据透视表进行重塑,但由于索引而仅填充第一年列,来尝试使用透视功能。
我设法手动进行了这种类型的重塑,但是由于有数年的数据,这是很耗时的解决方案。这是手动解决方案的示例代码:
mydata = pd.DataFrame()
mydata2 = pd.DataFrame()
mydata3 = pd.DataFrame()
mydata1['1'] = df['data'].iloc[160:664]
mydata2['2'] = df['data'].iloc[2769:3273]
mydata3['3'] = df['data'].iloc[5583:6087]
mydata1.reset_index(drop=True, inplace=True)
mydata2.reset_index(drop=True, inplace=True)
mydata3.reset_index(drop=True, inplace=True)
mydata = pd.concat([mydata1, mydata2, mydata3],axis=1, ignore_index=True)
mydata.columns = ['78','88','00','05']
答案 0 :(得分:0)
欢迎使用StackOverflow!我想我理解您从问题中提出的要求,但是如果我错了,请纠正我。基本上,您想使用枢轴重塑当前的pandas.DataFrame
。我建立了一个样本数据集,并通过以下方式解决了问题:
import pandas as pd
#test set
df = pd.DataFrame({'Index':['2.1.2000','3.1.2000','3.1.2001','4.1.2001','3.1.2002','4.1.2002'],
'Value':[100,101,110,111,105,104]})
#create a year column for yourself
#by splitting on '.' and selecting year element.
df['Year'] = df['Index'].str.split('.', expand=True)[2]
#pivot your table
pivot = pd.pivot_table(df, index=df.index, columns='Year', values='Value')
#now, in my pivoted test set there should be unwanted null values showing up so
#we can apply another function that drops null values in each column without losing values in other columns
pivot = pivot.apply(lambda x: pd.Series(x.dropna().values))
| Year | 2000 | 2001 | 2002 |
|------|------|------|------|
| 0 | 100 | 110 | 105 |
| 1 | 101 | 111 | 104 |
希望这可以解决您的问题!