কীভাবে ডেটা ফ্রেম পিভট করা যায়


358
  • পিভট কী?
  • আমি কীভাবে পিভট করব?
  • এটি কি পিভট?
  • দীর্ঘ বিন্যাসে প্রশস্ত বিন্যাসে?

আমি প্রচুর প্রশ্ন দেখেছি যা পিভট টেবিলগুলি সম্পর্কে জিজ্ঞাসা করে। এমনকি যদি তারা না জানে যে তারা পিভট টেবিলগুলি সম্পর্কে জিজ্ঞাসা করছে তবে তারা সাধারণত। পাইওটিংয়ের সমস্ত দিককে অন্তর্ভুক্ত এমন কোনও প্রমিত প্রশ্ন এবং উত্তর লেখা কার্যত অসম্ভব ....

... তবে আমি একবারে যেতে যাচ্ছি


বিদ্যমান প্রশ্ন এবং উত্তরগুলির সাথে সমস্যাটি হ'ল প্রায়শই প্রশ্নটি এমন একটি উপদ্রবটির দিকে নিবদ্ধ থাকে যে ওপরে বিদ্যমান ভাল উত্তরগুলির বেশ কয়েকটি ব্যবহারের ক্ষেত্রে সাধারণীকরণে সমস্যা হয়। যাইহোক, উত্তরের কোনওটিই বিস্তৃত ব্যাখ্যা দেওয়ার চেষ্টা করে না (কারণ এটি একটি দুরূহ কাজ)

আমার গুগল অনুসন্ধান থেকে কয়েকটি উদাহরণ দেখুন

  1. পান্ডসে ডেটাফ্রেম কীভাবে করা যায়?
    • ভাল প্রশ্নোত্তর তবে উত্তরটি কেবল সামান্য ব্যাখ্যা দিয়ে নির্দিষ্ট প্রশ্নের উত্তর দেয়।
  2. ডেটা ফ্রেমে পান্ডস পিভট টেবিল
    • এই প্রশ্নে, ওপ পিভট আউটপুট নিয়ে উদ্বিগ্ন। যথা কলামগুলি দেখতে কেমন লাগে। ওপি চাইছিল এটি আর এর মতো দেখতে প্যান্ডাস ব্যবহারকারীদের পক্ষে খুব কার্যকর নয়।
  3. পান্ডাস একটি ডেটা ফ্রেম পিভট করছে, সারিগুলির সদৃশ
    • অন্য একটি শালীন প্রশ্ন কিন্তু উত্তরটি একটি পদ্ধতির উপর দৃষ্টি নিবদ্ধ করে, যথা pd.DataFrame.pivot

সুতরাং যখনই কেউ অনুসন্ধান করেন pivotতারা বিক্ষিপ্ত ফলাফল পান যা সম্ভবত তাদের নির্দিষ্ট প্রশ্নের উত্তর দেয় না।


সেটআপ

আপনি লক্ষ্য করতে পারেন যে আমি কীভাবে নীচের উত্তরগুলিতে পিভট করতে চলেছি তার সাথে মিল রাখতে আমার কলামগুলি এবং প্রাসঙ্গিক কলাম মানগুলি স্পষ্টতই নামকরণ করেছি।

import numpy as np
import pandas as pd
from numpy.core.defchararray import add

np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(
    add(cols, arr1), columns=cols
).join(
    pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)

     key   row   item   col  val0  val1
0   key0  row3  item1  col3  0.81  0.04
1   key1  row2  item1  col2  0.44  0.07
2   key1  row0  item1  col0  0.77  0.01
3   key0  row4  item0  col2  0.15  0.59
4   key1  row0  item2  col1  0.81  0.64
5   key1  row2  item2  col4  0.13  0.88
6   key2  row4  item1  col3  0.88  0.39
7   key1  row4  item1  col1  0.10  0.07
8   key1  row0  item2  col4  0.65  0.02
9   key1  row2  item0  col2  0.35  0.61
10  key2  row0  item2  col1  0.40  0.85
11  key2  row4  item1  col2  0.64  0.25
12  key0  row2  item2  col3  0.50  0.44
13  key0  row4  item1  col4  0.24  0.46
14  key1  row3  item2  col3  0.28  0.11
15  key0  row3  item1  col1  0.31  0.23
16  key0  row0  item2  col3  0.86  0.01
17  key0  row4  item0  col3  0.64  0.21
18  key2  row2  item2  col0  0.13  0.45
19  key0  row2  item0  col4  0.37  0.70

প্রশ্ন (গুলি)

  1. কেন পাবো? ValueError: Index contains duplicate entries, cannot reshape

  2. আমি কীভাবে এটিকে পাইভট করব dfযে colমানগুলি কলাম হয়, rowমানগুলি সূচক val0হয় এবং মানগুলি কী হয়?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605    NaN  0.860  0.65
    row2  0.13    NaN  0.395  0.500  0.25
    row3   NaN  0.310    NaN  0.545   NaN
    row4   NaN  0.100  0.395  0.760  0.24
  3. আমি কীভাবে এটিকে পাইভট করব dfযে colমানগুলি কলাম হয়, rowমানগুলি সূচক হয় , মানগুলি কী val0হয় এবং নিখোঁজ মানগুলি কী হয় 0?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.100  0.395  0.760  0.24
  4. আমি কি অন্য কিছু পেতে পারি mean, সম্ভবত sum?

    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
  5. আমি কি আরও একবারে আরও একীকরণ করতে পারি?

           sum                          mean                           
    col   col0  col1  col2  col3  col4  col0   col1   col2   col3  col4
    row                                                                
    row0  0.77  1.21  0.00  0.86  0.65  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.00  0.79  0.50  0.50  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.31  0.00  1.09  0.00  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.10  0.79  1.52  0.24  0.00  0.100  0.395  0.760  0.24
  6. আমি একাধিক মান কলামের উপরে একত্রিত করতে পারি?

          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
  7. একাধিক কলাম দ্বারা উপ-বিভাগ করতে পারে?

    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
  8. অথবা

    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
  9. কলাম এবং সারি একসাথে ঘটে যাওয়া ফ্রিকোয়েন্সিটিকে আমি কী একত্রিত করতে পারি, ওরফে "ক্রস ট্যাবুলেশন"?

    col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
  10. কেবলমাত্র দুটি কলামে পিভোটিং করে কীভাবে আমি একটি ডেটা ফ্রেমকে দীর্ঘ থেকে প্রশস্ত রূপান্তর করব? দেওয়া,

    np.random.seed([3, 1415])
    df2 = pd.DataFrame({'A': list('aaaabbbc'), 'B': np.random.choice(15, 8)})        
    df2        
       A   B
    0  a   0
    1  a  11
    2  a   2
    3  a  11
    4  b  10
    5  b  10
    6  b  14
    7  c   7

    প্রত্যাশিত কিছু দেখতে হবে

          a     b    c
    0   0.0  10.0  7.0
    1  11.0  10.0  NaN
    2   2.0  14.0  NaN
    3  11.0   NaN  NaN
  11. আমি কীভাবে একক সূচীতে একাধিক সূচককে সমতল করব pivot

    থেকে

       1  2   
       1  1  2        
    a  2  1  1
    b  2  1  0
    c  1  0  0

    প্রতি

       1|1  2|1  2|2               
    a    2    1    1
    b    2    1    0
    c    1    0    0

উত্তর:


301

আমরা প্রথম প্রশ্নের উত্তর দিয়ে শুরু:

প্রশ্ন 1

কেন পাবো? ValueError: Index contains duplicate entries, cannot reshape

এটি ঘটে কারণ পান্ডারা নকল এন্ট্রি সহ কোনও columnsবা indexঅবজেক্টকে পুনরায় সূচি দেওয়ার চেষ্টা করছে । পিভট সম্পাদন করতে পারে এমন ব্যবহারের জন্য বিভিন্ন পদ্ধতি রয়েছে। যেগুলি কীগুলিতে পিভট করতে বলা হচ্ছে তার ডুপ্লিকেট থাকলে সেগুলির মধ্যে কিছু ঠিকঠাক নয়। উদাহরণ স্বরূপ. বিবেচনা করুন pd.DataFrame.pivot। আমি জানি যে এখানে সদৃশ এন্ট্রি রয়েছে যাগুলি rowএবং colমানগুলি ভাগ করে দেয় :

df.duplicated(['row', 'col']).any()

True

তাই আমি যখন pivotব্যবহার করছি

df.pivot(index='row', columns='col', values='val0')

আমি উপরে উল্লিখিত ত্রুটি পেয়েছি। আসলে, আমি যখন একই কাজটি সম্পাদন করার চেষ্টা করি তখন আমি একই ত্রুটি পাই:

df.set_index(['row', 'col'])['val0'].unstack()

এখানে আইভেমগুলির একটি তালিকা যা আমরা পাইভট করতে পারি

  1. pd.DataFrame.groupby + + pd.DataFrame.unstack
    • পিভট সম্পর্কে কেবল কোনও প্রকারের জন্য ভাল সাধারণ পদ্ধতির
    • আপনি সমস্ত কলামগুলি নির্দিষ্ট করেছেন যা একটি গ্রুপে পিভোটেড সারি স্তর এবং কলাম স্তরকে গঠন করবে। আপনি একত্রিত করতে চান বাকী কলামগুলি এবং ফাংশন (গুলি) নির্বাচন করে আপনি এটি একত্রিত করতে চান। অবশেষে, আপনি unstackযে স্তরের কলাম সূচীতে থাকতে চান তা আপনি।
  2. pd.DataFrame.pivot_table
    • groupbyআরও স্বজ্ঞাত এপিআই সহ একটি গৌরবময় সংস্করণ । অনেক লোকের জন্য এটি পছন্দসই পদ্ধতি। এবং এটি বিকাশকারীদের দ্বারা অভিপ্রায়িত পন্থা।
    • সারি স্তর, কলাম স্তরগুলি, একত্রিত হওয়ার মানগুলি এবং একত্রিত করার জন্য ফাংশন (গুলি) নির্দিষ্ট করুন।
  3. pd.DataFrame.set_index + + pd.DataFrame.unstack
    • কিছু জন্য সুবিধাজনক এবং স্বজ্ঞাত (আমার অন্তর্ভুক্ত)। সদৃশ দলবদ্ধ কীগুলি হ্যান্ডেল করতে পারে না।
    • অনুরূপ groupbyদৃষ্টান্ত, আমরা সব কলাম যে অবশেষে পারেন সারি বা কলাম মাত্রা হতে হবে এবং সূচক হতে ঐ সেট হবে উল্লেখ করুন। আমরা তখন unstackকলামগুলিতে স্তরগুলি চাই। যদি বাকী সূচক স্তরগুলি বা কলামের স্তরগুলি অনন্য না হয় তবে এই পদ্ধতিটি ব্যর্থ হবে।
  4. pd.DataFrame.pivot
    • set_indexএটি সদৃশ কী সীমাবদ্ধতা ভাগ করে নেওয়ার মতোই similar এপিআইও খুব সীমিত। এটা শুধুমাত্র জন্য স্কালে মান লাগে index, columns, values
    • pivot_tableযে পদ্ধতিতে আমরা সারি, কলাম এবং মানগুলি পিভট করতে হয় তার মতোই । তবে আমরা একত্রিত করতে পারি না এবং যদি সারি বা কলামগুলি অনন্য না হয় তবে এই পদ্ধতিটি ব্যর্থ হবে।
  5. pd.crosstab
    • এটির pivot_tableবিশুদ্ধতম রূপে এটির একটি বিশেষ সংস্করণ হ'ল বেশ কয়েকটি কাজ সম্পাদনের সর্বাধিক স্বজ্ঞাত উপায়।
  6. pd.factorize + + np.bincount
    • এটি একটি অত্যন্ত উন্নত প্রযুক্তি যা খুব অস্পষ্ট তবে খুব দ্রুত। এটি সব পরিস্থিতিতে ব্যবহার করা যাবে না, তবে এটি ব্যবহার করা যায় এবং আপনি এটি ব্যবহারে স্বাচ্ছন্দ্য বোধ করেন, আপনি পারফরম্যান্সের পুরষ্কারগুলি কাটাবেন।
  7. pd.get_dummies + + pd.DataFrame.dot
    • আমি এটি চতুরতার সাথে ক্রস ট্যাবুলেশন সম্পাদনের জন্য ব্যবহার করি।

উদাহরণ

আমি প্রতিটি পরবর্তী উত্তর এবং প্রশ্নের জন্য যা করতে যাচ্ছি তা হ'ল এটি ব্যবহার করে উত্তর দেওয়া pd.DataFrame.pivot_table। তারপরে আমি একই কাজটি সম্পাদনের বিকল্প সরবরাহ করব।

প্রশ্ন 3

আমি কীভাবে এটিকে পাইভট করব dfযে colমানগুলি কলাম হয়, rowমানগুলি সূচক হয় , মানগুলি কী val0হয় এবং নিখোঁজ মানগুলি কী হয় 0?

  • pd.DataFrame.pivot_table

    • fill_valueডিফল্ট হিসাবে সেট করা হয় না। আমি এটি সঠিকভাবে সেট করার ঝোঁক। এই ক্ষেত্রে আমি এটি সেট 0। লক্ষ্য করুন আমি প্রশ্ন 2 এড়িয়ে গেছি কারণ এটি উত্তর ছাড়াই এই উত্তরটির মতোfill_value
    • aggfunc='mean'ডিফল্ট এবং আমি এটি সেট করতে হবে না। আমি এটি স্পষ্ট হতে অন্তর্ভুক্ত।

      df.pivot_table(
          values='val0', index='row', columns='col',
          fill_value=0, aggfunc='mean')
      
      col   col0   col1   col2   col3  col4
      row                                  
      row0  0.77  0.605  0.000  0.860  0.65
      row2  0.13  0.000  0.395  0.500  0.25
      row3  0.00  0.310  0.000  0.545  0.00
      row4  0.00  0.100  0.395  0.760  0.24
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='mean').fillna(0)

প্রশ্ন 4

আমি কি অন্য কিছু পেতে পারি mean, সম্ভবত sum?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc='sum')
    
    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='sum').fillna(0)

প্রশ্ন 5

আমি কি আরও একবারে আরও একীকরণ করতে পারি?

লক্ষ্য করুন যে জন্য pivot_tableএবং crosstabআমাকে কলযোগ্যদের তালিকাটি পাস করতে হবে। অন্যদিকে, groupby.aggসীমিত সংখ্যক বিশেষ ক্রিয়াকলাপের জন্য স্ট্রিং নিতে সক্ষম। groupby.aggআমরা অন্যদের কাছে একই কলয়েবলগুলিও নিয়ে যেতাম, তবে অর্জন করার দক্ষতা রয়েছে বলে স্ট্রিং ফাংশনটির নামগুলি উত্থাপন করা প্রায়শই বেশি দক্ষ।

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc=[np.size, np.mean])
    
         size                      mean                           
    col  col0 col1 col2 col3 col4  col0   col1   col2   col3  col4
    row                                                           
    row0    1    2    0    1    1  0.77  0.605  0.000  0.860  0.65
    row2    1    0    2    1    2  0.13  0.000  0.395  0.500  0.25
    row3    0    1    0    2    0  0.00  0.310  0.000  0.545  0.00
    row4    0    1    2    2    1  0.00  0.100  0.395  0.760  0.24
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc=[np.size, np.mean]).fillna(0, downcast='infer')

প্রশ্ন 6

আমি একাধিক মান কলামের উপরে একত্রিত করতে পারি?

  • pd.DataFrame.pivot_tableআমরা পাস করি values=['val0', 'val1']তবে আমরা তা পুরোপুরি ছেড়ে দিতে পারতাম

    df.pivot_table(
        values=['val0', 'val1'], index='row', columns='col',
        fill_value=0, aggfunc='mean')
    
          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)

প্রশ্ন 7

একাধিক কলাম দ্বারা উপ-বিভাগ করতে পারে?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
  • pd.DataFrame.groupby

    df.groupby(
        ['row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)

প্রশ্ন 8

একাধিক কলাম দ্বারা উপ-বিভাগ করতে পারে?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index=['key', 'row'], columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
  • pd.DataFrame.groupby

    df.groupby(
        ['key', 'row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
  • pd.DataFrame.set_index কারণ কীগুলির সেটটি উভয় সারি এবং কলামের জন্যই অনন্য

    df.set_index(
        ['key', 'row', 'item', 'col']
    )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)

প্রশ্ন 9

কলাম এবং সারি একসাথে ঘটে যাওয়া ফ্রিকোয়েন্সিটিকে আমি কী একত্রিত করতে পারি, ওরফে "ক্রস ট্যাবুলেশন"?

  • pd.DataFrame.pivot_table

    df.pivot_table(index='row', columns='col', fill_value=0, aggfunc='size')
    
        col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(df['row'], df['col'])
  • pd.factorize + + np.bincount

    # get integer factorization `i` and unique values `r`
    # for column `'row'`
    i, r = pd.factorize(df['row'].values)
    # get integer factorization `j` and unique values `c`
    # for column `'col'`
    j, c = pd.factorize(df['col'].values)
    # `n` will be the number of rows
    # `m` will be the number of columns
    n, m = r.size, c.size
    # `i * m + j` is a clever way of counting the 
    # factorization bins assuming a flat array of length
    # `n * m`.  Which is why we subsequently reshape as `(n, m)`
    b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
    # BTW, whenever I read this, I think 'Bean, Rice, and Cheese'
    pd.DataFrame(b, r, c)
    
          col3  col2  col0  col1  col4
    row3     2     0     0     1     0
    row2     1     2     1     0     2
    row0     1     0     1     2     1
    row4     2     2     0     1     1
  • pd.get_dummies

    pd.get_dummies(df['row']).T.dot(pd.get_dummies(df['col']))
    
          col0  col1  col2  col3  col4
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1

প্রশ্ন 10

কেবলমাত্র দুটি কলামে পিভোটিং করে কীভাবে আমি একটি ডেটা ফ্রেমকে দীর্ঘ থেকে প্রশস্ত রূপান্তর করব?

প্রথম পদক্ষেপটি প্রতিটি সারিতে একটি নম্বর বরাদ্দ করা হয় - এই সংখ্যাটি মূল ফলাফলের মধ্যে সেই মানটির সারি সূচক হবে। এটি ব্যবহার করে করা হয় GroupBy.cumcount:

df2.insert(0, 'count', df.groupby('A').cumcount())
df2

   count  A   B
0      0  a   0
1      1  a  11
2      2  a   2
3      3  a  11
4      0  b  10
5      1  b  10
6      2  b  14
7      0  c   7

দ্বিতীয় পদক্ষেপটি হ'ল নতুন তৈরি কলামটি কল করতে সূচক হিসাবে ব্যবহার করা DataFrame.pivot

df2.pivot(*df)
# df.pivot(index='count', columns='A', values='B')

A         a     b    c
count                 
0       0.0  10.0  7.0
1      11.0  10.0  NaN
2       2.0  14.0  NaN
3      11.0   NaN  NaN

প্রশ্ন 11

আমি কীভাবে একক সূচীতে একাধিক সূচককে সমতল করব pivot

যদি columnsটাইপ objectস্ট্রিং সঙ্গেjoin

df.columns = df.columns.map('|'.join)

আর format

df.columns = df.columns.map('{0[0]}|{0[1]}'.format) 

43
আপনি দয়া করে অফিসিয়াল ডক্স প্রসারিত বিবেচনা করতে পারেন ?
ম্যাক্সু

# 10 প্রশ্নের উত্তর দিয়ে কী ঘটেছিল? আমি পেতে KeyError: 'A'। উত্তরের আরও কি আছে?
মনিকা হেডনেক

@ মনিকা হেইডনেক আমি এটি আবার পর্যালোচনা করব এবং প্রয়োজনে আপডেট করব। তবে, 'A'ধরে 'A'নিচ্ছেন যে আপনার ডেটাফ্রেমে একটি দলবদ্ধভাবে গ্রুপ হয়েছে।
পিয়ারস্কোয়ার্ড

আমি একাধিক মান কলামের উপরে একত্রিত করতে পারি? এর জন্য উত্তরটি বিভিন্ন ডেটা ধরণের কলামগুলির জন্য কাজ করবে। উদাহরণস্বরূপ: মানগুলি = ['ভাল0', 'ভাল1'], এখানে ভাল0 ইন্টি এবং ভ্যাল 1 স্ট্রিং রয়েছে
অনিল কুমার

1
প্রশ্ন 10 এ কলামটি সন্নিবেশ করা প্রয়োজন হয় না, এটি পিভট টেবিলের মধ্যে একটি আর্গুমেন্ট হিসাবে সরাসরি পাস করা যেতে পারে
এএসভ

4

@ পাইরস্কয়ার্ডের উত্তরটি প্রসারণ 10 এর অন্য সংস্করণে প্রসারিত করতে

প্রশ্ন 10.1

DataFrame:

d = data = {'A': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 5},
 'B': {0: 'a', 1: 'b', 2: 'c', 3: 'a', 4: 'b', 5: 'a', 6: 'c'}}
df = pd.DataFrame(d)

   A  B
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  3  a
6  5  c

আউটপুট:

   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

ব্যবহার df.groupbyএবংpd.Series.tolist

t = df.groupby('A')['B'].apply(list)
out = pd.DataFrame(t.tolist(),index=t.index)
out
   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

বা এর সাথে আরও অনেক ভাল বিকল্প ব্যবহার pd.pivot_tableকরেdf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.