目次
データセット:
元のデータ フレームが次のようになるようにデータ フレームを溶解するにはどうすればよいですか?
これを転置して、1 つの列が各科目を表し、他の列が生徒の名前とその年齢およびスコアを繰り返し表示したいと考えています。
のみを出力し、
質問 4:
ここにあるソリューションのほとんどは
溶解ロジック:
列をマージし、データフレームのコピーを (より長く) 作成します。
次のように
スタック
问题 6:
ホームページ バックエンド開発 Python チュートリアル パンダのデータフレームを溶かすにはどうすればよいですか?

パンダのデータフレームを溶かすにはどうすればよいですか?

Feb 09, 2024 pm 11:30 PM

如何融化 pandas 数据框?

質問内容

pandas タグでは、pandas でのデータフレームの溶解について質問するユーザーをよく見かけます。このトピックに関して標準的な Q&A (自己回答) をしてみます。

明確にしておきたい:

  1. 溶けるって何?

  2. メルトの使い方は?

  3. メルトをいつ使用するか?

メルティングに関して次のようなよくある質問を確認しました。

  • パンダを使用して列を行に変換する: これは実際には良いかもしれませんが、より詳しい説明があれば幸いです。

  • pandasmelt関数: 良い質問と良い答えがありますが、あまり説明がないと少し曖昧すぎます。

  • パンダ データフレームの溶解: これも素晴らしい答えです。ただし、これは特定の場合に限ったもので、単純です。単に pd.melt(df)

    です。
  • 列を行として使用するパンダ データフレーム (溶解) : 非常にきれいです。しかし、問題は、OP によって尋ねられた特定の質問のみに対処しており、pivot_table の使用も必要であることです。

それでは、このトピックに関して標準的な Q&A を実行してみます。

データセット:

私は、ランダムな年齢のランダムな人々のランダムな成績のこのデータセットからすべての答えを見つけます (答えを説明するのは簡単です:d):

リーリー リーリー ###質問:### ###質問1:###

元のデータ フレームが次のようになるようにデータ フレームを溶解するにはどうすればよいですか?

リーリー

これを転置して、1 つの列が各科目を表し、他の列が生徒の名前とその年齢およびスコアを繰り返し表示したいと考えています。

###質問2:###

これは質問 1 と似ていますが、今回は質問 1 で

subject

列に

math

のみを出力し、

english# を除外したいと考えています。 ## カラム: ## # リーリー

出力を上記のようにしたいと思います。 質問 3: メルトをグループ化し、生徒のスコア順に並べ替える場合、次のような目的の出力を得るにはどうすればよいでしょうか: リーリー カンマで区切られた名前と、カンマで区切られた

subjects

をそれぞれ同じ順序で並べ替える必要があります。

質問 4:

溶けたデータフレームを

フリーズを解除するにはどうすればよいですか?このデータフレームを溶かしたとしましょう:

リーリー ###なる:### リーリー では、以下のように元のデータ フレームに変換するにはどうすればよいでしょうか? リーリー

質問 5:

学生名でグループ化し、科目と成績をカンマで区切る場合はどうすればよいですか?

リーリー 上記のようなデータフレームが必要です。

質問6:

すべての列を値としてデータフレームを完全に溶かすとしたら、どうすればよいでしょうか?

リーリー

上記のようなデータフレームが必要です。すべての列を値として。

正解

##pandas バージョン に関するメモ: df.melt(... )# を使用します## を例として挙げますが、代わりに

pd.melt(df, .. .)

を使用する必要があります。

ドキュメント参照:

ここにあるソリューションのほとんどは


melt

で動作します。そのため、melt の方法については、## を参照してください。 # ドキュメントには が示されています。

溶解ロジック:

melting は複数の列をマージし、データフレームを幅広から長さに変換し、問題 1 (以下を参照) を解決します。手順は次のとおりです: まず、元のデータ フレームを取得します。 次に、melt は最初に math 列と

english

列をマージし、データフレームのコピーを (より長く) 作成します。

    最後に、
  1. subject

    列を追加します。これは、

    grades
  2. 列値の主題です:
  3. これは、melt 関数の単純なロジックです。

    ###解決:### ###質問1:###
  4. 問題 1 は、
  5. pd.dataframe.melt を使用して解決できます。 次のコードを使用します。 リーリー このコードは、id_vars

    パラメータを
  6. ['name', 'age']
に渡し、

value_vars を他の列 (##) に自動的に設定します。 # ['math', 'english'])、これはこの形式への転置変換です。

次のように

スタック

を使用することもできます: リーリー このコードは、name 列と

age

列をインデックスとして設定し、残りの列 mathenglish をスタックし、インデックスをリセットします。列名として grade を指定し、他の列の名前を level_2phpcnendcphp cn から subject

に変更してから、

subject 列を押して、最後にインデックスをリセットします。また。 これら 2 つのソリューションの出力: 解决问题 1 >

    name  age  subject grade
0    bob   13  english     c
1   john   16  english     b
2    foo   16  english     b
3    bar   15  english    a+
4   alex   17  english     f
5    tom   12  english     a
6    bob   13     math    a+
7   john   16     math     b
8    foo   16     math     a
9    bar   15     math     f
10  alex   17     math     d
11   tom   12     math     c
ログイン後にコピー

问题 2:

这和我的第一个问题类似,但是这个我只在 math 列中进行过滤,这时候 value_vars 参数就可以派上用场了,如下所示:

print(
    df.melt(
        id_vars=["name", "age"],
        value_vars="math",
        var_name="subject",
        value_name="grades",
    )
)
ログイン後にコピー

或者我们也可以使用 stack 与列规格:

print(
    df.set_index(["name", "age"])[["math"]]
    .stack()
    .reset_index(name="grade")
    .rename(columns={"level_2": "subject"})
    .sort_values("subject")
    .reset_index(drop=true)
)
ログイン後にコピー

这两种解决方案都给出:

   name  age subject grade
0   bob   13    math    a+
1  john   16    math     b
2   foo   16    math     a
3   bar   15    math     f
4  alex   15    math     d
5   tom   13    math     c
ログイン後にコピー

问题 3:

问题3可以通过melt解决和 groupby,使用 agg 函数和 ' , '.join,如下所示:

print(
    df.melt(id_vars=["name", "age"])
    .groupby("value", as_index=false)
    .agg(", ".join)
)
ログイン後にコピー

它会融合数据框,然后按等级进行分组,聚合它们并用逗号将它们连接起来。

stack也可以用来解决这个问题,与 stackgroupby 如下所示:

print(
    df.set_index(["name", "age"])
    .stack()
    .reset_index()
    .rename(columns={"level_2": "subjects", 0: "grade"})
    .groupby("grade", as_index=false)
    .agg(", ".join)
)
ログイン後にコピー

这个 stack 函数只是转置数据帧以相当于 melt 的方式,然后重置索引,重命名列、组和聚合。

两种解决方案输出:

  grade             name                subjects
0     a         foo, tom           math, english
1    a+         bob, bar           math, english
2     b  john, john, foo  math, english, english
3     c         bob, tom           english, math
4     d             alex                    math
5     f        bar, alex           math, english
ログイン後にコピー

问题 4:

这可以通过 pivot_table 来解决。我们必须指定参数 valuesindexcolumns 以及 aggfunc

我们可以用下面的代码来解决这个问题:

print(
    df.pivot_table("grades", ["name", "age"], "subject", aggfunc="first")
    .reset_index()
    .rename_axis(columns=none)
)
ログイン後にコピー

输出:

   name  age english math
0  alex   15       f    d
1   bar   15      a+    f
2   bob   13       c   a+
3   foo   16       b    a
4  john   16       b    b
5   tom   13       a    c
ログイン後にコピー

融化的数据帧被转换回与原始数据帧完全相同的格式。

我们首先旋转融化的数据框,然后重置索引并删除列轴名称。

问题 5:

问题5可以通过melt解决和 groupby 如下所示:

print(
    df.melt(id_vars=["name", "age"], var_name="subject", value_name="grades")
    .groupby("name", as_index=false)
    .agg(", ".join)
)
ログイン後にコピー

融化并按 name 分组。

或者您可以stack

print(
    df.set_index(["name", "age"])
    .stack()
    .reset_index()
    .groupby("name", as_index=false)
    .agg(", ".join)
    .rename({"level_2": "subjects", 0: "grades"}, axis=1)
)
ログイン後にコピー

两个代码输出:

   name       subjects grades
0  alex  math, english   d, f
1   bar  math, english  f, a+
2   bob  math, english  a+, c
3   foo  math, english   a, b
4  john  math, english   b, b
5   tom  math, english   c, a
ログイン後にコピー

问题 6:

问题6可以通过melt解决并且不需要指定列,只需指定预期的列名称:

print(df.melt(var_name='column', value_name='value'))
ログイン後にコピー

这会融化整个数据框。

或者您可以stack

print(
    df.stack()
    .reset_index(level=1)
    .sort_values("level_1")
    .reset_index(drop=true)
    .set_axis(["column", "value"], axis=1)
)
ログイン後にコピー

两个代码输出:

     Column Value
0       Age    16
1       Age    15
2       Age    15
3       Age    16
4       Age    13
5       Age    13
6   English    A+
7   English     B
8   English     B
9   English     A
10  English     F
11  English     C
12     Math     C
13     Math    A+
14     Math     D
15     Math     B
16     Math     F
17     Math     A
18     Name  Alex
19     Name   Bar
20     Name   Tom
21     Name   Foo
22     Name  John
23     Name   Bob
ログイン後にコピー

以上がパンダのデータフレームを溶かすにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

正規表現とは何ですか? 正規表現とは何ですか? Mar 20, 2025 pm 06:25 PM

正規表現は、プログラミングにおけるパターンマッチングとテキスト操作のための強力なツールであり、さまざまなアプリケーションにわたるテキスト処理の効率を高めます。

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

人気のあるPythonライブラリとその用途は何ですか? 人気のあるPythonライブラリとその用途は何ですか? Mar 21, 2025 pm 06:46 PM

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles