パンダのデータフレームを溶かすにはどうすればよいですか?
pandas タグでは、pandas でのデータフレームの溶解について質問するユーザーをよく見かけます。このトピックに関して標準的な Q&A (自己回答) をしてみます。
明確にしておきたい:
-
溶けるって何?
-
メルトの使い方は?
-
メルトをいつ使用するか?
メルティングに関して次のようなよくある質問を確認しました。
-
パンダを使用して列を行に変換する: これは実際には良いかもしれませんが、より詳しい説明があれば幸いです。
-
pandasmelt関数: 良い質問と良い答えがありますが、あまり説明がないと少し曖昧すぎます。
-
パンダ データフレームの溶解: これも素晴らしい答えです。ただし、これは特定の場合に限ったもので、単純です。単に
です。pd.melt(df)
-
列を行として使用するパンダ データフレーム (溶解) : 非常にきれいです。しかし、問題は、OP によって尋ねられた特定の質問のみに対処しており、
pivot_table
の使用も必要であることです。
それでは、このトピックに関して標準的な Q&A を実行してみます。
データセット:
私は、ランダムな年齢のランダムな人々のランダムな成績のこのデータセットからすべての答えを見つけます (答えを説明するのは簡単です:d):
リーリー リーリー ###質問:### ###質問1:###元のデータ フレームが次のようになるようにデータ フレームを溶解するにはどうすればよいですか?
リーリーこれを転置して、1 つの列が各科目を表し、他の列が生徒の名前とその年齢およびスコアを繰り返し表示したいと考えています。
###質問2:###これは質問 1 と似ていますが、今回は質問 1 で
subject列に
mathのみを出力し、
english# を除外したいと考えています。 ## カラム: ## # リーリー出力を上記のようにしたいと思います。
質問 3:
メルトをグループ化し、生徒のスコア順に並べ替える場合、次のような目的の出力を得るにはどうすればよいでしょうか:
リーリー
カンマで区切られた名前と、カンマで区切られた
をそれぞれ同じ順序で並べ替える必要があります。
質問 4:
溶けたデータフレームを
フリーズを解除するにはどうすればよいですか?このデータフレームを溶かしたとしましょう:
リーリー
###なる:###
リーリー
では、以下のように元のデータ フレームに変換するにはどうすればよいでしょうか?
リーリー
学生名でグループ化し、科目と成績をカンマで区切る場合はどうすればよいですか?
リーリー 上記のようなデータフレームが必要です。
質問6:すべての列を値としてデータフレームを完全に溶かすとしたら、どうすればよいでしょうか?
リーリー
上記のようなデータフレームが必要です。すべての列を値として。正解
##pandas バージョン に関するメモ: df.melt(... )# を使用します## を例として挙げますが、代わりにpd.melt(df, .. .)
を使用する必要があります。ドキュメント参照:
ここにあるソリューションのほとんどは
melt
で動作します。そのため、melt
の方法については、## を参照してください。 # ドキュメントには
が示されています。
溶解ロジック:
melting は複数の列をマージし、データフレームを幅広から長さに変換し、問題 1 (以下を参照) を解決します。手順は次のとおりです:
まず、元のデータ フレームを取得します。
次に、melt は最初に math 列と
列をマージし、データフレームのコピーを (より長く) 作成します。
- 最後に、
- subject
列を追加します。これは、
grades 列値の主題です: -
melt
関数の単純なロジックです。 問題 1 は、 -
pd.dataframe.melt
パラメータをを使用して解決できます。
次のコードを使用します。 リーリーこのコードは、
id_vars ['name', 'age']
value_vars を他の列 (##) に自動的に設定します。 # ['math', 'english']
)、これはこの形式への転置変換です。
次のように
スタック
を使用することもできます:
リーリー
このコードは、
name 列と
列をインデックスとして設定し、残りの列 math
と english
をスタックし、インデックスをリセットします。列名として 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
也可以用来解决这个问题,与 stack
和 groupby
如下所示:
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
来解决。我们必须指定参数 values
、index
、columns
以及 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:
print( df.melt(id_vars=["name", "age"], var_name="subject", value_name="grades") .groupby("name", as_index=false) .agg(", ".join) )
融化并按 name
分组。
或者您可以stack
: p>
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
: p>
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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