Pandas:如何使用列作为索引,然后将以前索引中的重复内容变为新索引中的重复内容?

piwo6bdm  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(121)

基本上我是想把这个,

dft = pd.DataFrame({1: [0.1,0.4,0.2,0.5],2:[0.4,0.5,0.3,0.4],3:[0.2,0.4,0.6,0.7]}, index=['t1', 't1','t2','t2'])
dft.index.name = "tt"
dft.columns.name='num'

num 1   2   3
tt          
t1  0.1 0.4 0.2
t1  0.4 0.5 0.4
t2  0.2 0.3 0.6
t2  0.5 0.4 0.7

变成这样,

tt  t1  t2
num     
1   0.1 0.2
1   0.4 0.5
2   0.4 0.3
2   0.5 0.4
3   0.2 0.6
3   0.4 0.7

使用(可能)pandas方法。如果有帮助的话,我可以把如何创建第二个df的代码包括进来。我想可能已经有答案了,但在我尝试过的搜索尝试中出现了其他事情。

c9qzyr3d

c9qzyr3d1#

试试看:

(dft.set_index(dft.groupby('tt').cumcount(), append=True) # enumerate the rows within each `tt`
    .unstack(level=-1).T                                  # pivot the enumeration and flip
    .reset_index(level=1, drop=True)                      # remove enumeration     
)

输出量:

tt    t1   t2
num          
1    0.1  0.2
1    0.4  0.5
2    0.4  0.3
2    0.5  0.4
3    0.2  0.6
3    0.4  0.7
trnvg8h3

trnvg8h32#

你可以做什么:
1.按'tt'分组DataFrame
1.将项目聚合到列表中
1.转置 Dataframe
1.使用按't1'和't2'列分解

dft = pd.DataFrame({1: [0.1,0.4,0.2,0.5],2:[0.4,0.5,0.3,0.4],3:[0.2,0.4,0.6,0.7]}, index=['t1', 't1','t2','t2'])
dft.index.name = "tt"
dft.columns.name='num'

new_dft = (
    dft.groupby('tt')
    .agg(lambda x: list(x))
    .transpose()
    .explode(['t1', 't2'])
)

new_dft
tt  t1  t2
num     
1   0.1 0.2
1   0.4 0.5
2   0.4 0.3
2   0.5 0.4
3   0.2 0.6
3   0.4 0.7
aydmsdu9

aydmsdu93#

另一种可能的解决方案:

(pd.concat([
    x.droplevel(level=0) for _, x in dft.stack().groupby(level=0)], axis=1)
 .sort_index().set_axis(dft.index.unique(), axis=1))

输出量:

tt    t1   t2
num          
1    0.1  0.2
1    0.4  0.5
2    0.4  0.3
2    0.5  0.4
3    0.2  0.6
3    0.4  0.7

相关问题