如何在Python中使用多年数据重塑数据框

时间:2018-11-15 18:59:51

标签: python pandas

我相信我的问题可以通过循环来解决,但我无法创建这样的循环。我有一个看起来像这样的数据样本 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']

1 个答案:

答案 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  |

希望这可以解决您的问题!