สร้างดาต้าเฟรมจากคู่ค่าที่ไม่ซ้ำโดยการกรองหลายคอลัมน์

ฉันต้องการกรองค่าในหลายคอลัมน์เพื่อสร้าง dataframes สำหรับชุดค่าผสมที่ไม่ซ้ำ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

นี่คือรหัสของฉันที่ล้มเหลว (ระบุ dataframe df):

dd = defaultdict(dict)  #create blank default dictionary
values_col1 = df.col1.unique()   #get the unique values from column 1 of df
for i in values_col1:
    dd[i] = df[(df['col1']==i)]    #for each unique value create a sorted df and put in in a dictionary
    values_col2 = dd[i].col2.unique() #get the unique values from column2 of df
    for m in values_col2:  
        dd[i][m] = dd[i][(dd[i]['col2']==m)]  #for each unique column2 create a sub dictionary

เมื่อฉันรันมัน ฉันได้รับข้อความแสดงข้อผิดพลาดที่ยาวมาก ฉันจะไม่แทรกสิ่งทั้งหมดที่นี่ แต่นี่คือบางส่วน:

C:\Anaconda3\lib\site-packages\pandas\indexes\base.py ใน get_loc(self, key, method, allowance) 1944 ลอง: -> 1945 return self._engine.get_loc(key) 1946 ยกเว้น KeyError:

...

ValueError: จำนวนรายการไม่ถูกต้องผ่าน 6 ตำแหน่งหมายถึง 1


person sparrow    schedule 06.07.2016    source แหล่งที่มา
comment
เรียนรู้เกี่ยวกับการเรียงสับเปลี่ยนจำนวน   -  person Merlin    schedule 06.07.2016


คำตอบ (1)


ใช้ฟังก์ชัน pandas groupby เพื่อแยกดัชนีเฉพาะและแถวที่เกี่ยวข้องของ dataframe ของคุณ

import pandas as pd
from collections import defaultdict

df = pd.DataFrame({'col1': ['A']*4 + ['B']*4,
                   'col2': [0,1]*4,
                   'col3': np.arange(8),
                   'col4': np.arange(10, 18)})

dd = defaultdict(dict)
grouped = df.groupby(['col1', 'col2'])
for (c1, c2), g in grouped:
    dd[c1][c2] = g

นี่คือ df ที่สร้างขึ้น:

  col1  col2  col3  col4
0    A     0     0    10
1    A     1     1    11
2    A     0     2    12
3    A     1     3    13
4    B     0     4    14
5    B     1     5    15
6    B     0     6    16
7    B     1     7    17

และนี่คือ dd ที่แยกออกมา (คือ dict(dd) จริงๆ)

{'B': {0:   col1  col2  col3  col4
          4    B     0     4    14
          6    B     0     6    16,
       1:   col1  col2  col3  col4
          5    B     1     5    15
          7    B     1     7    17},
 'A': {0:   col1  col2  col3  col4
          0    A     0     0    10
          2    A     0     2    12,
       1:   col1  col2  col3  col4
          1    A     1     1    11
          3    A     1     3    13}}

(ฉันไม่รู้ว่ากรณีการใช้งานของคุณคืออะไร แต่คุณอาจจะดีกว่าถ้าไม่แยกวิเคราะห์วัตถุ groupby ลงในพจนานุกรม)

person Alberto Garcia-Raboso    schedule 06.07.2016
comment
ขอบคุณ Alberto คุณสร้างกลุ่มในโค้ดด้านบนได้อย่างไร - person sparrow; 06.07.2016
comment
ขออภัย ลืมคัดลอกบรรทัดนั้น แก้ไขแล้ว - person Alberto Garcia-Raboso; 06.07.2016
comment
ขอบคุณสำหรับโซลูชันที่หรูหรา! - person sparrow; 06.07.2016