我有一个单行数据框,如下所示

Num     TP1(USD)    TP2(USD)    TP3(USD)    VReal1(USD)     VReal2(USD)     VReal3(USD)     TiV1 (EUR)  TiV2 (EUR)  TiV3 (EUR)  TR  TR-Tag
AA-24   0       700     2100    300     1159    2877    30       30     47      10  5

我想得到一个像下面这样的数据帧

ID  Price   Net     Range
1   0       300     30
2   700     1159    30
3   2100    2877    47

这里的逻辑是

我试了df.filter(regex='TP').stack()次.我得到了所有的"TP"列&我可以访问索引([0]、[1]、[2])中的单个值.我不能把他们全部直接编入一个专栏.

我还想知道是否有更简单的方法来做到这一点.

推荐答案

假设'Num'是唯一标识符,则可以使用pandas.wide_to_long:

pd.wide_to_long(df, stubnames=['TP', 'VR', 'TV'], i='Num', j='ID')

或者,对于更接近您的输出:

out = (pd
 .wide_to_long(df, stubnames=['TP', 'VR', 'TV'], i='Num', j='ID')
 .reset_index('ID')
 .drop(columns=['TR', 'TR-Tag'])
 .rename(columns={'TP': 'Price', 'VR': 'Net', 'TV': 'Range'})
 )

输出:

       ID  Price   Net  Range
Num                          
AA-24   1      0   300     30
AA-24   2    700  1159     30
AA-24   3   2100  2877     47
updated answer
out = (pd
 .wide_to_long(df.set_axis(df.columns.str.replace(r'\(USD\)$', '', regex=True),
                           axis=1),
               stubnames=['TP', 'VReal', 'TiV'], i='Num', j='ID')
 .reset_index('ID')
 .drop(columns=['TR', 'TR-Tag'])
 .rename(columns={'TP': 'Price', 'VReal': 'Net', 'TiV': 'Range'})
 )

输出:

       ID  Price   Net  Range
Num                          
AA-24   1      0   300     30
AA-24   2    700  1159     30
AA-24   3   2100  2877     47

Python相关问答推荐

如何访问所有文件,例如环境变量

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

在Django admin中自动完成相关字段筛选

未知依赖项pin—1阻止conda安装""

如何更新pandas DataFrame上列标题的de值?

如何在FastAPI中为我上传的json文件提供索引ID?

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

基于形状而非距离的两个numpy数组相似性

python panda ExcelWriter切换动态公式到数组公式

将标签移动到matplotlib饼图中楔形块的开始处

为什么'if x is None:pass'比'x is None'单独使用更快?

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

在用于Python的Bokeh包中设置按钮的样式

统计numpy. ndarray中的项目列表出现次数的最快方法

使用python playwright从 Select 子菜单中 Select 值

有没有办法在不先将文件写入内存的情况下做到这一点?

多个矩阵的张量积

我可以同时更改多个图像吗?

组颠倒大Pandas 数据帧

Pip:卸载`-e`安装过程中安装的所有pkgs