2016-08-21 23 views
0

我有這樣的後續數據幀:如何獲得切割所需的值在不同的山坳中的蟒蛇數據幀

pop state value1  value2 
0 1.8 Ohio 2000001  2100345 
1 1.9 Ohio 2001001  1000524 
2 3.9 Nevada 2002100  1000242 
3 2.9 Nevada 2001003  1234567 
4 2.0 Nevada 2002004  1420000 

而且我有一個有序字典類似以下內容:

OrderedDict([(1, OrderedDict([('value1_1', [1, 2]),('value1_2', [3, 4]),('value1_3',[5,7])])),(1, OrderedDict([('value2_1', [1, 1]),('value2_2', [2, 5]),('value2_3',[6,7])]))]) 

我想以OrderedDict所需的方式更改數據幀。

pop state value1_1 value1_2 value1_3 value2_1 value2_2 value2_3  
0 1.8 Ohio  20  0   1  2  1003  45 
1 1.9 Ohio  20  1   1  1   5  24 
2 3.9 Nevada 20  2   100  1   2  42 
3 2.9 Nevada 20  1   3  1  2345  67 
4 2.0 Nevada 20  2   4  1  4200  0 

我認爲這是真的蟒蛇大熊貓一個複雜的邏輯。我該如何解決它?謝謝。

回答

1

首先,您的OrderedDict覆蓋相同的密鑰,您需要使用不同的密鑰。現在

d= OrderedDict([(1, OrderedDict([('value1_1', [1, 2]),('value1_2', [3, 4]),('value1_3',[5,7])])),(2, OrderedDict([('value2_1', [1, 1]),('value2_2', [2, 5]),('value2_3',[6,7])]))]) 

,爲您的實際問題,你可以通過d迭代來獲得的項目,並使用在數據幀的apply函數來獲取你所需要的。

for k,v in d.items(): 
    for k1,v1 in v.items(): 
     if k == 1: 
      df[k1] = df.value1.apply(lambda x : int(str(x)[v1[0]-1:v1[1]])) 
     else: 
      df[k1] = df.value2.apply(lambda x : int(str(x)[v1[0]-1:v1[1]])) 

現在,df是

pop state value1 value2 value1_1 value1_2 value1_3 value2_1 \ 
0 1.8 Ohio 2000001 2100345  20   0   1   2 
1 1.9 Ohio 2001001 1000524  20   1   1   1 
2 3.9 Nevada 2002100 1000242  20   2  100   1 
3 2.9 Nevada 2001003 1234567  20   1   3   1 
4 2.0 Nevada 2002004 1420000  20   2   4   1 

    value2_2 value2_3 
0  1003  45 
1   5  24 
2   2  42 
3  2345  67 
4  4200   0 
1

我認爲這將指向您在正確的方向。

轉換的value1value2string類型:

df['value1'], df['value2'] = df['value1'].astype(str), df['value2'].astype(str) 


dct_1,dct_2 = OrderedDict([('value1_1', [1, 2]),('value1_2', [3, 4]),('value1_3',[5,7])]), 
       OrderedDict([('value2_1', [1, 1]),('value2_2', [2, 5]),('value2_3',[6,7])]) 

轉換Ordered Dictionary到元組的列表:

dct_1_list, dct_2_list = list(dct_1.items()), list(dct_2.items()) 

壓扁列表的列表到一個列表:

L1, L2 = sum(list(x[1] for x in dct_1_list), []), sum(list(x[1] for x in dct_2_list), []) 

由1減去list的偶數切片爲字符串索引從0開始,而不是1:

L1[::2], L2[::2] = np.array(L1[0::2]) - np.array([1]), np.array(L2[0::2]) - np.array([1]) 

以適當的切片位置和映射這些值到dataframe的新創建的列:

df['value1_1'],df['value1_2'],df['value1_3']= map(df['value1'].str.slice,L1[::2],L1[1::2]) 
df['value2_1'],df['value2_2'],df['value2_3']= map(df['value2'].str.slice,L2[::2],L2[1::2]) 

刪除掉不需要的列:

df.drop(['value1', 'value2'], axis=1, inplace=True) 

最終結果:

print(df) 

    pop state value1_1 value1_2 value1_3 value2_1 value2_2 value2_3 
0 1.8 Ohio  20  00  001  2  1003  45 
1 1.9 Ohio  20  01  001  1  0005  24 
2 3.9 Nevada  20  02  100  1  0002  42 
3 2.9 Nevada  20  01  003  1  2345  67 
4 2.0 Nevada  20  02  004  1  4200  00