pandas 如何转换一个 Dataframe ,使列的值是列名,列名是行,但不堆叠?

wh6knrhe  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(112)

我比较两个表来监视变化。我需要一个结果表,显示每个用户每个属性的变化前后。
我使用了pandas .compare方法,下面是我当前结果的一个例子,但我不知道下一步会是什么。如果我完全错了,请随时让我知道。
我现在有一个表,看起来像这样:
| 用户ID|姓名|最喜欢的|状态|
| --------------|--------------|--------------|--------------|
| 1|史蒂夫|巧克力|之前|
| 第二章|约翰|巧克力|之前|
| 1|史蒂维|巧克力|之后|
| 第二章|约翰|香草|之后|
我需要它看起来像这样:
| 用户ID|属性已更改|之前|之后|
| --------------|--------------|--------------|--------------|
| 1|姓名|史蒂夫|史蒂维|
| 第二章|姓名|约翰|约翰|
| 1|最喜欢的|巧克力|巧克力|
| 第二章|最喜欢的|巧克力|香草|
我可以删除未做任何更改的行。

nvbavucw

nvbavucw1#

也许通过pivot

import pandas as pd

df = pd.read_clipboard() # Your df here

out = (
    df
    .pivot(index="User ID", columns="Status")
    .swaplevel(axis=1)
    .stack()
    .reset_index(names=["User ID", "Attribute Changed"])
    .rename_axis(None, axis=1)
)

输出:

User ID Attribute Changed      After     Before
0        1          Favorite  Chocolate  Chocolate
1        1              Name      Stevy      Steve
2        2          Favorite    Vanilla  Chocolate
3        2              Name       John       John
8gsdolmq

8gsdolmq2#

您可以unstackconcatenate,如

# import pandas as pd
# df = pd.read_html('https://stackoverflow.com/questions/75922021')[0]

unstacked_df = df.set_index(['User ID','Status']).unstack()

kList = {c[0] for c in unstacked_df.columns} ## {'Name','Favorite'}
dfList = [unstacked_df[k] for k in kList] ## [u__df['Name'],u__df['Favorite']]
conc_df = pd.concat(dfList, keys=kList, names=['Attribute Changed', 'User ID'])

df2Cols = ['User ID', 'Attribute Changed', 'After', 'Before']
df2 = conc_df.reset_index().rename_axis(None,axis='columns')[df2Cols]
unstacked_dfconc_dfdf2


|

|

|

相关问题