如何在python中使用给定的数据框构建新的数据帧

时间:2018-04-05 15:40:45

标签: python dataframe

我得到了这样一个数据集:

index value
1     2.5
2     3.7
3     2.0
4     4.0
5     6.5
6     1.6
7     3.9
...   ...

我需要将数据转换为以下格式:

index value1 value2 value3 
1     2.5    3.7    2.0
2     3.7    2.0    4.0
3     2.0    4.0    6.5
4     4.0    6.5    1.6
5     6.5    1.6    3.9
...   ...    ...

有没有办法有效地做到这一点?这是数据的一个示例,我必须像20行数据的窗口一样移动,并执行此过程以按顺序填充数据集。

谢谢!

2 个答案:

答案 0 :(得分:1)

使用.shift

#rename column 'value' to 'value1'
df = df.rename(columns={'value':'value1'})
#perform loop
end_num=5
for i in range(2,end_num):
    df['value' + str(i)] = df['value' + str(i-1)].shift(-1)

输出

value1  value2  value3  value4
0   2.5     3.7     2.0     4.0
1   3.7     2.0     4.0     6.5
2   2.0     4.0     6.5     1.6
3   4.0     6.5     1.6     3.9
4   6.5     1.6     3.9     NaN
5   1.6     3.9     NaN     NaN
6   3.9     NaN     NaN     NaN

答案 1 :(得分:1)

另一个替代方案是将两个班次拉开并从2开始切片以移除nans:

重新创建数据框:

import pandas as pd

data = '''\
index value
1     2.5
2     3.7
3     2.0
4     4.0
5     6.5
6     1.6
7     3.9'''

df = pd.read_csv(pd.compat.StringIO(data), sep='\s+').set_index('index')

解压缩3列拉链

newvalues = list(zip(df['value'].shift(2),df['value'].shift(1),df['value']))
df2 = pd.DataFrame(newvalues[2:],columns=['value1','value2','value3'])

print(df2)

打印

   value1  value2  value3
0     2.5     3.7     2.0
1     3.7     2.0     4.0
2     2.0     4.0     6.5
3     4.0     6.5     1.6
4     6.5     1.6     3.9

或更通用的方法,n = 3:

n = 3
newvalues = list(zip(*(df['value'].shift(i) for i in range(n-1,-1,-1))))
cols = ['value{}'.format(i) for i in range(1,n+1)]
df2 = pd.DataFrame(newvalues[n-1:],columns=cols)

或者使用pd.concat(),但是对于小数据集来说这似乎更慢。

n = 3
df2 = pd.concat((df['value'].shift(i)[n-1:] for i in range(n-1,-1,-1)), axis=1)
df2.columns = ['value{}'.format(i) for i in range(1,n+1)]