Pythonデータフレームで複数の列を行に変換/ピボット解除します

シャシャンク

複数の行にピボット解除する必要があるデータセットがあります。

例えば:

id  cor_id1 mail11 mail12 mail13 cor_id2 mail21 mail22 mail23 cor_id3 mail31 mail32 mail33
1    1      a@123  b@234  c@123    2     a@def  b@fgh   c@asd   3      s@wer  b@ert  e@rty
2    4      e@234  e@234  e@qwe    9     e@dfe  f@jfg   r@ert   10     e@wer  g@wer  e@ert

私はそれらを次のようにピボット解除する必要があります

id cor_id mail
1   1     a@123
1   1     b@234
1   1     c@123
1   2     a@def
1   2     b@fgh
1   2     c@asd
1   3     s@wer
1   3     b@ert
1   3     e@rty
2   4     e@234
2   4     e@234
2   4     e@qwe
2   9     e@dfe
2   9     r@ert
2   10    e@wer
2   10    g@wer
2   10    e@ert

df.meltを試しましたが、1列しか表示されません。

データに行に変換される複数の列がある場合はどうなりますか。

id  cor_id1 ad1 mail11 mail12 mail13 cor_id2 ad2 mail21 mail22 mail23 cor_id3 ad3 mail31 mail32 mail33
1    1     23    a@123  b@234  c@123        2   24  a@def  b@fgh   c@asd      3   25   s@wer  b@ert  e@rty
2    4     33    e@234  e@234  e@qwe        9   34 e@dfe  f@jfg   r@ert      10  35    e@wer  g@wer  e@ert

そして私は欲しい

id cor_id  ad  mail
1   1      23  a@123
1   1      23 b@234
1   1      23 c@123
1   2      24 a@def
1   2      24  b@fgh
1   2      24 c@asd
1   3      25 s@wer
1   3      25 b@ert
1   3      25 e@rty
2   4      33 e@234
2   4      33 e@234
2   4      33 e@qwe
2   9      34 e@dfe
2   9      34 f@jfg
2   9      34 r@ert
2   10     35 e@wer
2   10     35 g@wer
2   10     35 e@ert
ジェズリール

を使用しますwide_to_longが、最初にcor_id、最後の桁を追加する列の列名を変更する必要があります

df = df.rename(columns=lambda x: x + x[-1] if x.startswith('cor_id') else x)
df = pd.wide_to_long(df, ['cor_id', 'mail'], i='id', j='i')
df['cor_id'] = df['cor_id'].ffill()
df = df.reset_index(level=1, drop=True).reset_index()

別の方法は、0不足している行をdropna次のように追加および削除することです。

df = df.rename(columns=lambda x: x + '0' if x.startswith('cor_id') else x)
df = pd.wide_to_long(df, ['cor_id', 'mail'], i='id', j='i')
df['cor_id'] = df['cor_id'].ffill()
df = df.dropna(subset=['mail']).reset_index(level=1, drop=True).reset_index()

print (df)
    id  cor_id   mail
0    1     1.0  a@123
1    1     1.0  b@234
2    1     1.0  c@123
3    1     1.0  a@def
4    1     2.0  b@fgh
5    1     2.0  s@wer
6    1     2.0  b@ert
7    1     3.0  e@rty
8    1     3.0  c@asd
9    2     4.0  e@234
10   2     4.0  e@234
11   2     4.0  e@qwe
12   2     4.0  e@dfe
13   2     9.0  f@jfg
14   2     9.0  e@wer
15   2     9.0  g@wer
16   2    10.0  e@ert
17   2    10.0  r@ert

EDIT:などの複数の列がある場合cor_idのみにすることにより、テストのためのタプルに追加startswithし、その後ですべての列によって前方充填を変更するlistffill

df = df.rename(columns=lambda x: x + '0' if x.startswith(('cor_id','ad')) else x)
df = pd.wide_to_long(df, ['cor_id', 'ad','mail'], i='id', j='i')
df[['cor_id','ad']] = df[['cor_id','ad']].ffill()
df = df.dropna(subset=['mail']).reset_index(level=1, drop=True).reset_index()
print (df)
    id  cor_id    ad   mail
0    1     1.0  23.0  a@123
1    1     1.0  23.0  b@234
2    1     1.0  23.0  c@123
3    1     2.0  24.0  a@def
4    1     2.0  24.0  b@fgh
5    1     2.0  24.0  c@asd
6    1     3.0  25.0  s@wer
7    1     3.0  25.0  b@ert
8    1     3.0  25.0  e@rty
9    2     4.0  33.0  e@234
10   2     4.0  33.0  e@234
11   2     4.0  33.0  e@qwe
12   2     9.0  34.0  e@dfe
13   2     9.0  34.0  f@jfg
14   2     9.0  34.0  r@ert
15   2    10.0  35.0  e@wer
16   2    10.0  35.0  g@wer
17   2    10.0  35.0  e@ert

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Pandasデータフレームの変換:ピボット解除

分類Dev

複数の文字列のリストをPythonデータフレームに変換します

分類Dev

deedleデータフレームのピボットを解除します

分類Dev

pandasデータフレームで列を複数の行に変換する

分類Dev

tidyr ::ピボット_longerを使用して1行のデータフレームを変換する:列のペアを取得してスタックします

分類Dev

データフレームを固定列数にピボットしますsparksql

分類Dev

Rでデータフレームの複数の列を文字列から数値に変換します

分類Dev

データフレームを整頓された形式に変換する方法(ピボット解除)?

分類Dev

Sparkデータフレームは複数の行を列に変換します

分類Dev

パンダは複数のgroupbyでデータフレームをピボットします

分類Dev

複数のデータフレーム列を数値ベクトルに変換します

分類Dev

複数の列のデータを持つ同じ列の行データを新しいデータフレームに変換します

分類Dev

R複数の文字列長のリストをデータフレームに変換します

分類Dev

複数のデータフレームの行名をデータフレームの列に変換します

分類Dev

Rデータフレーム:複数行の値をリストに変換します

分類Dev

複数行の文字列をデータフレームに変換する

分類Dev

データフレームをピボットして複数の行を1つに折りたたむ方法

分類Dev

同じ列でグループ化した後、pysparkデータフレームのピボットを解除します

分類Dev

JSONオブジェクトの配列を含むSparkデータフレーム列を複数の行に変換します

分類Dev

複数の列を使用してPandasデータフレームをピボットする

分類Dev

複数の行を持つPandasデータフレームを1つの行に変換します

分類Dev

ループ内の複数のデータフレームの最初の行を列名に変換します

分類Dev

複数のデータフレームの最後の列をRの係数に変換します

分類Dev

データフレームを使用してCSV列の値を複数の行に変換する

分類Dev

kdb + / qピボットテーブルで複数の列を1つの列に変換しますか?

分類Dev

rで、データフレームの列を「リスト解除」なしで動的な名前のベクトルに変換します

分類Dev

データフレームの複数の列の文字列をfloatに変換します

分類Dev

SQL Server-ピボット行を列に変換します(追加の行データを使用)

分類Dev

2列のデータフレームを複数の列に変換しますか?

Related 関連記事

  1. 1

    Pandasデータフレームの変換:ピボット解除

  2. 2

    複数の文字列のリストをPythonデータフレームに変換します

  3. 3

    deedleデータフレームのピボットを解除します

  4. 4

    pandasデータフレームで列を複数の行に変換する

  5. 5

    tidyr ::ピボット_longerを使用して1行のデータフレームを変換する:列のペアを取得してスタックします

  6. 6

    データフレームを固定列数にピボットしますsparksql

  7. 7

    Rでデータフレームの複数の列を文字列から数値に変換します

  8. 8

    データフレームを整頓された形式に変換する方法(ピボット解除)?

  9. 9

    Sparkデータフレームは複数の行を列に変換します

  10. 10

    パンダは複数のgroupbyでデータフレームをピボットします

  11. 11

    複数のデータフレーム列を数値ベクトルに変換します

  12. 12

    複数の列のデータを持つ同じ列の行データを新しいデータフレームに変換します

  13. 13

    R複数の文字列長のリストをデータフレームに変換します

  14. 14

    複数のデータフレームの行名をデータフレームの列に変換します

  15. 15

    Rデータフレーム:複数行の値をリストに変換します

  16. 16

    複数行の文字列をデータフレームに変換する

  17. 17

    データフレームをピボットして複数の行を1つに折りたたむ方法

  18. 18

    同じ列でグループ化した後、pysparkデータフレームのピボットを解除します

  19. 19

    JSONオブジェクトの配列を含むSparkデータフレーム列を複数の行に変換します

  20. 20

    複数の列を使用してPandasデータフレームをピボットする

  21. 21

    複数の行を持つPandasデータフレームを1つの行に変換します

  22. 22

    ループ内の複数のデータフレームの最初の行を列名に変換します

  23. 23

    複数のデータフレームの最後の列をRの係数に変換します

  24. 24

    データフレームを使用してCSV列の値を複数の行に変換する

  25. 25

    kdb + / qピボットテーブルで複数の列を1つの列に変換しますか?

  26. 26

    rで、データフレームの列を「リスト解除」なしで動的な名前のベクトルに変換します

  27. 27

    データフレームの複数の列の文字列をfloatに変換します

  28. 28

    SQL Server-ピボット行を列に変換します(追加の行データを使用)

  29. 29

    2列のデータフレームを複数の列に変換しますか?

ホットタグ

アーカイブ