pandas 태그에서 pandas의 데이터 프레임 녹는 것에 대해 질문하는 사용자를 자주 봅니다. 나는 이 주제에 대해 표준적인 Q&A(자체 답변)를 하려고 노력할 것입니다.
명확하게 말씀드리고 싶은 점:
멜팅이란 무엇인가요?
멜트는 어떻게 사용하나요?
멜트는 언제 사용하나요?
녹는 것에 관해 다음과 같은 인기 있는 질문을 보았습니다.
팬더를 사용하여 열을 행으로 변환: 이것은 실제로 좋을 수도 있지만 더 많은 설명이 있으면 좋을 것입니다.
pandas 용해 기능: 좋은 답변이 포함된 좋은 질문이지만 별다른 설명이 없어 너무 모호합니다.
Melting pandas dataframe: 역시 훌륭한 답변입니다! 하지만 그것은 단지 특정한 경우에 대한 것일 뿐이고 간단합니다. pd.melt(df)
열을 행으로 사용하는 pandas 데이터 프레임(녹음) : 매우 깔끔합니다! 하지만 문제는 pivot_table
를 사용해야 하는 OP의 특정 질문만 다룬다는 것입니다.
그래서 저는 이 주제에 대한 정식 Q&A를 시도해 보겠습니다.
나는 무작위 연령의 무작위 사람들을 대상으로 한 무작위 성적 데이터 세트에서 모든 답을 찾을 것입니다(답을 설명하기 더 쉽습니다 :d):
으아아아 으아아아원래 데이터프레임이 다음과 같이 되도록 데이터프레임을 녹이는 방법은 무엇인가요?
으아아아한 열은 과목별로, 다른 열은 학생의 나이, 점수와 함께 반복되는 이름으로 바꾸려고 합니다.
질문 1과 비슷하지만 이번에는 질문 1을 subject
列只有math
,我想过滤掉english
열:
위와 같은 출력을 원합니다.
멜트를 그룹화하고 학생들의 점수에 따라 정렬한다면 다음과 같이 원하는 결과를 얻으려면 어떻게 해야 할까요?
으아아아쉼표로 구분된 이름과 쉼표로 구분된 subjects
를 각각 같은 순서로 정렬해야 합니다.
용해된 데이터프레임을 어떻게 고정 해제 하나요? 이 데이터프레임을 녹였다고 가정해 보겠습니다.
으아아아되기:
으아아아그렇다면 아래와 같이 원래 데이터 프레임으로 다시 변환하려면 어떻게 해야 할까요?
으아아아학생들을 이름별로 그룹화하고 과목과 성적을 쉼표로 구분하고 싶다면 어떻게 해야 하나요?
으아아아저는 위와 같은 데이터프레임을 원합니다.
모든 열을 값으로 포함하여 데이터프레임을 완전히 녹인다면 어떻게 해야 합니까?
으아아아저는 위와 같은 데이터프레임을 원합니다. 모든 열은 값입니다.
Pandas 버전 < 0.20.0 에 대한 참고 사항: 대신 df.melt(...)
作为我的示例,但您需要使用 pd.melt(df, .. .)
을 사용하겠습니다.
여기에 있는 대부분의 솔루션은 melt
,所以要知道方法melt
에서 작동하므로 방법을 알아보려면
녹는 논리:
math
和 english
subject
列,它分别是 grades
melt
질문 1:
pd.dataframe.melt
문제 1은 다음 코드를 사용하여
을 사용하여 해결할 수 있습니다. id_vars
参数传递给 ['name', 'age']
,然后自动将 value_vars
设置为其他列(['math', 'english']
으아아아
)를 다음 형식으로 변환합니다.
stack
아래와 같이 解决问题 1 >
을 사용할 수도 있습니다. name
和 age
列设置为索引,并堆叠其余列 math
和 english
,并重置索引并指定 grade
作为列名称,然后将其他列重命名为 level_2phpcnendcphp cn 到 <code>subject
然后按subject
으아아아
name
및 age
열을 인덱스로 설정하고 나머지 열을 쌓고 인덱스를 재설정하고 grade
를 열 이름으로 지정합니다. 그런 다음 다른 열의 이름을 level_2phpcnendcphp cn to <code>subject
로 바꾼 다음 subject
열을 누르고 마지막으로 색인을 다시 재설정하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!