ホームページ > バックエンド開発 > Python チュートリアル > パンダのデータフレームを溶かすにはどうすればよいですか?

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

WBOY
リリース: 2024-02-09 23:30:14
転載
431 人が閲覧しました

如何融化 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 サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート