pandas 如何将melt / wide_to_long应用到具有多列的数据框?

ttisahbt  于 2022-12-25  发布在  其他
关注(0)|答案(4)|浏览(152)

我有一个one-hot编码的 Dataframe ,类似于下面的一个:
| 评论_评分|动作&冒险|经典电影|电视喜剧|电视悬疑片|
| - ------| - ------| - ------| - ------| - ------|
| 四个|无|无|1个|无|
| 十个|1个|无|无|无|
| 五个|1个|无|无|无|
| 七|无|1个|无|无|
| 八个|无|无|1个|无|
| 七|无|无|无|1个|
它包含40多个列,我认为将每个列名都放入函数中是不可行的。
如何旋转或重新排列表格,使其看起来像下面的表格:
| 体裁|评论_评分|
| - ------| - ------|
| 动作&冒险|十个|
| 动作&冒险|五个|
| 经典电影|七|
| 电视喜剧|四个|
| 电视喜剧|八个|
| 电视悬疑片|七|
我希望每个流派有一个行的每一个审查评分给出,以便绘制一个箱线图
我试过melt和wide_to_long函数,但无法得到所需的数据框。请咨询!

9q78igpj

9q78igpj1#

在panda 1.5.0+中,存在pd.from_dummies

import pandas as pd

genre = pd.from_dummies(df.drop(columns="review_score"))
pd.concat([genre[""].rename("Genre"), df["review_score"]], axis=1)

或者,使用pd.DataFrame.idxmax

genre = df.drop(columns="review_score").idxmax(axis=1)
pd.concat([genre.rename("Genre"), df["review_score"]], axis=1)
c2e8gylq

c2e8gylq2#

如果您没有1.5.0+版本的panda,您可以:

cols = ['review_score','Genre']
s = df.set_index('review_score').stack()
out = s[s==1].rename_axis(cols).reset_index()[cols]

print(out)

   review_score               Genre
0             4         TV Comedies
1            10  Action & Adventure
2             5  Action & Adventure
3             7      Classic Movies
4             8         TV Comedies
5             7        TV Mysteries
huwehgph

huwehgph3#

您可以使用ilocidxmax(axis=1)查找column_name,然后使用pandas.Series.to_frame()pandas.DataFrame.assign向旧 Dataframe 添加新列。

new_df = df['review_score'].to_frame().assign(Genre = df.iloc[:, 1:].idxmax(axis=1))
print(new_df)

输出:

review_score               Genre
0             4         TV Comedies
1            10  Action & Adventure
2             5  Action & Adventure
3             7      Classic Movies
4             8         TV Comedies
5             7        TV Mysteries
zkure5ic

zkure5ic4#

你好,我希望这对你有帮助,我用for循环

l=[]
k=[]
for i in df.columns[1:]:
    for j in range(len(df)):
        if df[i][j]==1:
            l.append(df.review_score[j])
            k.append(i)
result= pd.DataFrame()
result['Genre']=k
result['review_score']=l

输出:

Genre  review_score
0  Action_Adventure            10
1  Action_Adventure             5
2     ClassicMovies             7
3        TVComedies             4
4        TVComedies             8
5       TVMysteries             7

相关问题