分裂pandas列与元组

时间:2017-07-02 14:23:39

标签: python pandas dataframe

我有一份表格字典;

data = {A:[(1,2),(3,4),(5,6),(7,8),(8,9)],
        B:[(3,4),(4,5),(5,6),(6,7)],
        C:[(10,11),(12,13)]}

我通过以下方式创建一个dataFrame:

df = pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in data.iteritems()]))

反过来成为;

A       B     C 
(1,2) (3,4) (10,11)
(3,4) (4,5) (12,13)
(5,6) (5,6)   NaN
(6,7) (6,7)   NaN
(8,9)  NaN    NaN

有没有办法从上面的数据框转到下面的数据框:

   A       B       C
one two one two one two
1   2    3   4   10  11
3   4    4   5   12  13
5   6    5   6   NaN NaN
6   7    6   7   NaN NaN
8   9   NaN NaN  NaN NaN

1 个答案:

答案 0 :(得分:1)

您可以将list comprehensionDataFrame构造函数一起使用,将values + tolistconcat的列转换为numpy array

cols = ['A','B','C']
L = [pd.DataFrame(df[x].values.tolist(), columns=['one','two']) for x in cols]
df = pd.concat(L, axis=1, keys=cols)
print (df)

   A       B       C    
  one two one two one two
0   1   2   3   4   5   6
1   7   8   9  10  11  12
2  13  14  15  16  17  18

编辑:

dict comprehensioninteger s值的类似解决方案已转换为float s,因为type的{​​{1}}也是NaN。< / p>

float

编辑:

对于多列一列,可以使用slicers

data = {'A':[(1,2),(3,4),(5,6),(7,8),(8,9)],
        'B':[(3,4),(4,5),(5,6),(6,7)],
        'C':[(10,11),(12,13)]}

cols = ['A','B','C']
d = {k: pd.DataFrame(v, columns=['one','two']) for k,v in data.items()}
df = pd.concat(d, axis=1)
print (df)
    A        B          C      
  one two  one  two   one   two
0   1   2  3.0  4.0  10.0  11.0
1   3   4  4.0  5.0  12.0  13.0
2   5   6  5.0  6.0   NaN   NaN
3   7   8  6.0  7.0   NaN   NaN
4   8   9  NaN  NaN   NaN   NaN

另一种解决方案:

s = df[('A', 'one')]
print (s)
0    1
1    3
2    5
3    7
4    8
Name: (A, one), dtype: int64

df.loc(axis=1)[:, 'one'] = df.loc(axis=1)[:, 'one'].mul(s, axis=0)
print (df)
      A         B          C      
    one two   one  two   one   two
0   1.0   2   3.0  4.0  10.0  11.0
1   9.0   4  12.0  5.0  36.0  13.0
2  25.0   6  25.0  6.0   NaN   NaN
3  49.0   8  42.0  7.0   NaN   NaN
4  64.0   9   NaN  NaN   NaN   NaN