pandas DataFrame创建,访问,附加具有不同列类型的MultiIndex - SQL表样式

时间:2017-02-18 21:10:28

标签: python pandas dataframe types multi-index

我认为通过使用庞大的pandas.DataFrame库,你可以非常直接地完成你可以用SQL表做的所有标准的东西......但是在查看了很多选项后我仍然没有找到一个好的工作解决方案

要求:

  • 包含4列不同数据类型的表(uint32,string,...),其中3个应该作为索引使用
  • 许多(> 10k)类型为int8
  • 的其他列
  • 最初我有想法动态添加行和列,但结果非常慢(使用df.at [row,col] = y)
  • 我最终创建了一个包含不同类型的几列的DataFrame,并将其与另一个使用类型为uint8的numpy数组创建的大型DataFrame连接
  • ......看起来很不错,但现在没有任何方法可以使用索引来访问,添加或设置数组元素

    test('returns correct state when action type is "Bar"', () => {
      expect(myReducer({foo: ''}, {type: 'bar'})).toEqual({foo: ''})
    })
    
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,... 9)中设置值。 如果索引尚未可用,则应将其添加到表中。

               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

1 个答案:

答案 0 :(得分: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