python - 让 pandas Wide_to_long() 函数考虑 stub 在列名的末尾而不是开头

标签 python pandas dataframe numpy

我有一个很大的数据框,我需要将其转换为长数据。数据帧采用以下格式:

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/

相关文章:

python - 在 jupyter notebook 中使用 λ,φ,α,...,就像在 julia 中一样

python - Pandas 数据框。更改 float 格式。保留类型 "float"

python - 将 Pandas 数据帧中的所有 NaT 值更改为 Timedelta 00 :00:00

python - Pandas - 查找 2 个依赖属性的最大计数并用该值替换重复行

python - Pyspark - 将另一列添加到稀疏向量列

r - 计算 data.frame 中的行和和乘积

python - 使用 Python 读取 MS-Word 文件中页眉和页脚中的表格内容

python - pyqt - 无框架小部件出现奇怪的标题栏

python - 使用来自串行端口的字符串数据来操作振镜扫描仪在更高速度下出错

python - 如何在数据框中添加一列来说明每行来自哪个工作表名称? Python