我得到了这样一个数据集:
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行数据的窗口一样移动,并执行此过程以按顺序填充数据集。
谢谢!
答案 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)]