팬더 데이터프레임을 녹이는 방법은 무엇입니까?

WBOY
풀어 주다: 2024-02-09 23:30:14
앞으로
391명이 탐색했습니다.

如何融化 pandas 数据框?

질문 내용

pandas 태그에서 pandas의 데이터 프레임 녹는 것에 대해 질문하는 사용자를 자주 봅니다. 나는 이 주제에 대해 표준적인 Q&A(자체 답변)를 하려고 노력할 것입니다.

명확하게 말씀드리고 싶은 점:

  1. 멜팅이란 무엇인가요?

  2. 멜트는 어떻게 사용하나요?

  3. 멜트는 언제 사용하나요?

녹는 것에 관해 다음과 같은 인기 있는 질문을 보았습니다.

  • 팬더를 사용하여 열을 행으로 변환: 이것은 실제로 좋을 수도 있지만 더 많은 설명이 있으면 좋을 것입니다.

  • pandas 용해 기능: 좋은 답변이 포함된 좋은 질문이지만 별다른 설명이 없어 너무 모호합니다.

  • Melting pandas dataframe: 역시 훌륭한 답변입니다! 하지만 그것은 단지 특정한 경우에 대한 것일 뿐이고 간단합니다. pd.melt(df)

  • 열을 행으로 사용하는 pandas 데이터 프레임(녹음) : 매우 깔끔합니다! 하지만 문제는 pivot_table를 사용해야 하는 OP의 특정 질문만 다룬다는 것입니다.

그래서 저는 이 주제에 대한 정식 Q&A를 시도해 보겠습니다.

데이터세트:

나는 무작위 연령의 무작위 사람들을 대상으로 한 무작위 성적 데이터 세트에서 모든 답을 찾을 것입니다(답을 설명하기 더 쉽습니다 :d):

으아아아 으아아아

질문:

질문 1:

원래 데이터프레임이 다음과 같이 되도록 데이터프레임을 녹이는 방법은 무엇인가요?

으아아아

한 열은 과목별로, 다른 열은 학생의 나이, 점수와 함께 반복되는 이름으로 바꾸려고 합니다.

질문 2:

질문 1과 비슷하지만 이번에는 질문 1을 subject列只有math,我想过滤掉english열:

으로 출력하고 싶습니다. 으아아아

위와 같은 출력을 원합니다.

질문 3:

멜트를 그룹화하고 학생들의 점수에 따라 정렬한다면 다음과 같이 원하는 결과를 얻으려면 어떻게 해야 할까요?

으아아아

쉼표로 구분된 이름과 쉼표로 구분된 subjects를 각각 같은 순서로 정렬해야 합니다.

질문 4:

용해된 데이터프레임을 어떻게 고정 해제 하나요? 이 데이터프레임을 녹였다고 가정해 보겠습니다.

으아아아

되기:

으아아아

그렇다면 아래와 같이 원래 데이터 프레임으로 다시 변환하려면 어떻게 해야 할까요?

으아아아

질문 5:

학생들을 이름별로 그룹화하고 과목과 성적을 쉼표로 구분하고 싶다면 어떻게 해야 하나요?

으아아아

저는 위와 같은 데이터프레임을 원합니다.

질문 6:

모든 열을 값으로 포함하여 데이터프레임을 완전히 녹인다면 어떻게 해야 합니까?

으아아아

저는 위와 같은 데이터프레임을 원합니다. 모든 열은 값입니다.


정답


Pandas 버전 < 0.20.0 에 대한 참고 사항: 대신 df.melt(...) 作为我的示例,但您需要使用 pd.melt(df, .. .)을 사용하겠습니다.

문서 참조:

여기에 있는 대부분의 솔루션은 melt,所以要知道方法melt에서 작동하므로 방법을 알아보려면

문서 지침

을 참조하세요.

녹는 논리:

    Melting은 여러 열을 병합하고 데이터프레임을 넓은 것에서 긴 것으로 변환하고 문제 1을 해결합니다(아래 참조).
  1. 먼저 원본 데이터 프레임을 얻습니다.
  2. mathenglish

    그런 다음 Melt는
  3. 열을 먼저 병합하고 데이터 프레임을 복제합니다(더 길게).
  4. subject 列,它分别是 grades

    마지막으로 열 값에 대한
  5. 테마를 추가합니다.

melt

이것은

함수의 간단한 논리입니다.

해결책:

질문 1: pd.dataframe.melt문제 1은 다음 코드를 사용하여

을 사용하여 해결할 수 있습니다. id_vars 参数传递给 ['name', 'age'],然后自动将 value_vars 设置为其他列(['math', 'english'] 으아아아

이 코드는 전치인

)를 다음 형식으로 변환합니다. stack아래와 같이 解决问题 1 >

을 사용할 수도 있습니다. nameage 列设置为索引,并堆叠其余列 mathenglish,并重置索引并指定 grade 作为列名称,然后将其他列重命名为 level_2phpcnendcphp cn 到 <code>subject 然后按subject 으아아아

이 코드는 nameage 열을 인덱스로 설정하고 나머지 열을 쌓고

인덱스를 재설정하고 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
로그인 후 복사

问题 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!