我有一个很大的数据框,我需要将其转换为长数据。数据帧采用以下格式:
np.random.seed(0)
df = pd.DataFrame({'2010_A(weekly)': np.random.rand(3),
'2011_A(weekly)': np.random.rand(3),
'2010_B(weekly)': np.random.rand(3),
'2011_B(weekly)': np.random.rand(3),
'X' : np.random.randint(3, size=3)})
df['id'] = df.index
df
如果名称相反,如下所示:
np.random.seed(0)
df = pd.DataFrame({'A(weekly)_2010': np.random.rand(3),
'A(weekly)_2011': np.random.rand(3),
'B(weekly)_2010': np.random.rand(3),
'B(weekly)_2011': np.random.rand(3),
'X' : np.random.randint(3, size=3)})
df['id'] = df.index
df
使用起来很容易wide_to_long
将我的表格转换为所需的格式,如下所示:
pd.wide_to_long(df, ['A(weekly)', 'B(weekly)'], i='id',
j='year', sep='_')
但是,我还没有找到一种方法让 Wide_to_long 向后考虑名称。
有没有办法使用wide_to_long
在某种程度上它使用列的末尾来标识 stub 名称?
所需的输出是一个 5 列长的数据框,列名称为 "id", "year", "X", "A(weekly)", "B(weekly)"
最佳答案
这是不可能的pd.wide_to_long
。您必须使用其他方法或重命名列来交换字段:
>>> pd.wide_to_long(df.rename(columns=lambda x: '_'.join(x.split('_')[::-1])),
['A(weekly)', 'B(weekly)'], i='id', j='year', sep='_')
X A(weekly) B(weekly)
id year
0 2010 0 0.548814 0.437587
1 2010 1 0.715189 0.891773
2 2010 1 0.602763 0.963663
0 2011 0 0.544883 0.383442
1 2011 1 0.423655 0.791725
2 2011 1 0.645894 0.528895
关于python - 让 pandas Wide_to_long() 函数考虑 stub 在列名的末尾而不是开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75164373/