2017-02-18 18 views
2

Я думал, что с помощью огромной библиотеки pandas.DataFrame должно быть довольно просто сделать все стандартное содержимое, которое вы можете сделать с помощью таблицы SQL. но после изучения многих вариантов я до сих пор не нашел хорошего рабочего решения.pandas DataFrame create, access, append MultiIndex с разными типами столбцов - стиль таблицы SQL

Требование:

  • стол с 4 колонками с различными типами данных (uint32, строкой, ...), 3 от них должен работать как индекс
  • много (> 10k) дополнительных столбцов типа int8
  • Первоначально у меня возникла идея динамически добавлять строки и столбцы, но это оказалось очень медленным (с использованием df.at [row, col] = y)
  • В результате я создал DataFrame с несколькими столбцами с различными типами и присоединить его к другому большому DataFrame, созданному из массива numpy с элементерами ц типа uint8
  • ... которые выглядели довольно хорошо, но теперь ничего не работает для доступа, добавить или набор элементов массива с использованием индекса

    import numpy as np 
    import pandas as pd 
    
    # create DataFrame 
    
    idx_names = ['A','B','C'] 
    col_names = ['y'] 
    df = pd.DataFrame(columns = idx_names + col_names) 
    
    # create DataFrame from numpy array 
    
    npa = np.zeros((5,10),dtype=np.uint8) 
    dfa = pd.DataFrame(npa) 
    
    # add DataFrames column-wise 
    
    t = pd.concat([df,dfa], axis=1) 
    
    # set index columns 
    
    t.set_index(idx_names,inplace=True) 
    

   y 0 1 2 3 4 5 6 7 8 9 
A B C          
NaN NaN NaN NaN 0 0 0 0 0 0 0 0 0 0 
     NaN NaN 0 0 0 0 0 0 0 0 0 0 
     NaN NaN 0 0 0 0 0 0 0 0 0 0 
     NaN NaN 0 0 0 0 0 0 0 0 0 0 
     NaN NaN 0 0 0 0 0 0 0 0 0 0 

Теперь я бы например, устанавливать значения в столбцах (y, 0, ... 9) путем предоставления индекса. Если индекс еще не доступен, он должен быть добавлен в таблицу.

t((t['A']='US',t['B']='CA',t['C']='SFO') , 'y') = "IT" 
t((t['A']='US',t['B']='CA',t['C']='LA') , '1') = 255 
+0

Вы можете уточнить? Что вы ожидаете от того, что происходит на самом деле? Вы получаете какие-либо ошибки? Каков ваш последний вопрос? – kramer65

+0

Задайте новый вопрос, если у вас есть новый вопрос ... – MaxU

+1

попробуйте следующее: 't.loc [('US', 'CA', 'SFO'), 'y'] = 'IT '' – MaxU

ответ

0

Если у вас есть следующие многоиндексной DataFrame:

In [44]: df 
Out[44]: 
     d 
a b c 
0 0 1 1 
4 4 4 3 
0 1 4 4 
2 6 1 3 
0 1 3 6 

и вы хотите добавить следующую 2D массив в виде 10 новых столбцов:

In [45]: data 
Out[45]: 
array([[ 0.76021523, 0.92020945, 0.20205685, 0.03888115, 0.41166093, 0.67509844, 0.15351393, 0.00926459, 0.09297956, 0.72930072], 
     [ 0.38229582, 0.88199428, 0.08153019, 0.08367272, 0.88548522, 0.50332168, 0.94652147, 0.83362442, 0.219431 , 0.09399454], 
     [ 0.43743926, 0.79447959, 0.18430898, 0.31534202, 0.63229928, 0.80921108, 0.76570853, 0.09890863, 0.33604303, 0.92960105], 
     [ 0.6561763 , 0.26731786, 0.1266551 , 0.78960943, 0.900017 , 0.02468355, 0.99110764, 0.40402032, 0.46224193, 0.44569296], 
     [ 0.1509643 , 0.26830514, 0.69337022, 0.1339183 , 0.42711838, 0.0883597 , 0.6923594 , 0.01451872, 0.56684861, 0.46792245]]) 

Решение:

In [47]: df = df.join(pd.DataFrame(data, index=df.index)) 

In [48]: df 
Out[48]: 
     d   0   1   2   3   4   5   6   7   8   9 
a b c 
0 0 1 1 0.760215 0.920209 0.202057 0.038881 0.411661 0.675098 0.153514 0.009265 0.092980 0.729301 
4 4 4 3 0.382296 0.881994 0.081530 0.083673 0.885485 0.503322 0.946521 0.833624 0.219431 0.093995 
0 1 4 4 0.437439 0.794480 0.184309 0.315342 0.632299 0.809211 0.765709 0.098909 0.336043 0.929601 
2 6 1 3 0.656176 0.267318 0.126655 0.789609 0.900017 0.024684 0.991108 0.404020 0.462242 0.445693 
0 1 3 6 0.150964 0.268305 0.693370 0.133918 0.427118 0.088360 0.692359 0.014519 0.566849 0.467922 
+0

ok, g Это помогло. Теперь я могу добавлять/обновлять записи таким образом ... –

+0

@SvenMeyer, рад, что я мог бы помочь. Пожалуйста, примите [прием] (http://meta.stackexchange.com/a/5235) ответ, если вы считаете, что он ответил на ваш вопрос – MaxU