pandas タグでは、pandas でのデータフレームの溶解について質問するユーザーをよく見かけます。このトピックに関して標準的な Q&A (自己回答) をしてみます。
明確にしておきたい:
溶けるって何?
メルトの使い方は?
メルトをいつ使用するか?
メルティングに関して次のようなよくある質問を確認しました。
パンダを使用して列を行に変換する: これは実際には良いかもしれませんが、より詳しい説明があれば幸いです。
pandasmelt関数: 良い質問と良い答えがありますが、あまり説明がないと少し曖昧すぎます。
パンダ データフレームの溶解: これも素晴らしい答えです。ただし、これは特定の場合に限ったもので、単純です。単に pd.melt(df)
列を行として使用するパンダ データフレーム (溶解) : 非常にきれいです。しかし、問題は、OP によって尋ねられた特定の質問のみに対処しており、pivot_table
の使用も必要であることです。
それでは、このトピックに関して標準的な Q&A を実行してみます。
私は、ランダムな年齢のランダムな人々のランダムな成績のこのデータセットからすべての答えを見つけます (答えを説明するのは簡単です:d):
リーリー リーリー ###質問:### ###質問1:###これは質問 1 と似ていますが、今回は質問 1 で
subject列に
math出力を上記のようにしたいと思います。
質問 3:
メルトをグループ化し、生徒のスコア順に並べ替える場合、次のような目的の出力を得るにはどうすればよいでしょうか:
リーリー
カンマで区切られた名前と、カンマで区切られた
をそれぞれ同じ順序で並べ替える必要があります。
溶けたデータフレームを
フリーズを解除するにはどうすればよいですか?このデータフレームを溶かしたとしましょう:
リーリー
###なる:###
リーリー
では、以下のように元のデータ フレームに変換するにはどうすればよいでしょうか?
リーリー
リーリー 上記のようなデータフレームが必要です。
質問6:すべての列を値としてデータフレームを完全に溶かすとしたら、どうすればよいでしょうか?
リーリー
上記のようなデータフレームが必要です。すべての列を値として。正解
##pandas バージョン に関するメモ: df.melt(... )# を使用します## を例として挙げますが、代わりにpd.melt(df, .. .)
を使用する必要があります。ドキュメント参照:
で動作します。そのため、melt
の方法については、## を参照してください。 # ドキュメントには
が示されています。
melting は複数の列をマージし、データフレームを幅広から長さに変換し、問題 1 (以下を参照) を解決します。手順は次のとおりです:
まず、元のデータ フレームを取得します。
次に、melt は最初に math 列と
列を追加します。これは、
grades
これは、melt
関数の単純なロジックです。
pd.dataframe.melt を使用して解決できます。
次のコードを使用します。
リーリー
このコードは、
id_vars
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
这和我的第一个问题类似,但是这个我只在 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可以通过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
这可以通过 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
融化的数据帧被转换回与原始数据帧完全相同的格式。
我们首先旋转融化的数据框,然后重置索引并删除列轴名称。
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可以通过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 サイトの他の関連記事を参照してください。