我正在转换面板数据。我的原始数据是df,我想将其转换为df2。 Price_1表示1月的价格。Price_2表示2月份的价格,依此类推。这是我的解决方案,我的结果在df3中。
import numpy as np
import pandas as pd
df = pd.DataFrame({'item': ['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c'],
'month': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
'variable_name': ['price', 'price', 'price', 'quantity', 'quantity', 'quantity', 'price', 'price', 'price', 'quantity', 'quantity', 'quantity', 'price', 'price', 'price', 'quantity', 'quantity', 'quantity'],
'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ,18]
})
df2 = pd.DataFrame({'item': ['a', 'b', 'c'],
'price_1': [1, 7, 13],
'price_2': [2, 8, 14],
'price_3': [3, 9, 15],
'quantity_1': [4, 10, 16],
'quantity_2': [5, 11, 17],
'quantity_3': [6, 12, 18]
})
我的解决方法是:
month1 = df['month'].unique()
#date1 = pd.DatetimeIndex(date1)
#month1 = date1.month
varName = df['variable_name'].unique()
varName2=[]
for j in varName:
for i in month1:
t = j + '_' + str(i)
varName2.append(t)
x = df.value
indexName = df['item'].unique()
m = indexName.shape[0]
n = len(varName2)
df3 = pd.DataFrame(x.values.reshape(m, n), index = indexName, columns = varName2)
我的问题:将来数据会更多(大约2GB)。所以我想知道如何在python中有效地转换数据? (我的解决方案似乎效果不佳)。不必非常高效,并且优先使用主流库中的功能。谢谢。
df.set_index(['item',
df.variable_name + '_' + df.month.apply(str)]
)['value'].unstack().reset_index()
您想要的列名称是variable_name
和month
的串联。
因此,要实现这一点,请将item
和串联表达式设置为索引,将unstack
设置为枢轴,最后设置为reset_index