将一个到多个映射字典转换为Dataframe

时间:2017-06-01 07:27:06

标签: python pandas dictionary

我有一本字典如下:

d={1:(array[2,3]), 2:(array[8,4,5]), 3:(array[6,7,8,9])}

如图所示,这里每个键的值是可变长度数组。

现在我想将其转换为DataFrame。所以输出看起来像:

A   B
1   2
1   3
2   8
2   4
2   5
3   6
3   7
3   8
3   9

我使用了pd.Dataframe(d),但它没有处理一对多的映射。非常感谢。

3 个答案:

答案 0 :(得分:4)

使用Series构建函数与str.len一起使用lists的长度(array已转换为lists)。

然后使用DataFramenumpy.repeatnumpy.concatenate创建新的Index.values

d = {1:np.array([2,3]), 2:np.array([8,4,5]), 3:np.array([6,7,8,9])}
print (d)

a = pd.Series(d)
l = a.str.len()
df = pd.DataFrame({'A':np.repeat(a.index.values, l), 'B': np.concatenate(a.values)})
print (df)
   A  B
0  1  2
1  1  3
2  2  8
3  2  4
4  2  5
5  3  6
6  3  7
7  3  8
8  3  9

答案 1 :(得分:3)

pd.DataFrame(
    [[k, v] for k, a in d.items() for v in a.tolist()],
    columns=['A', 'B']
)

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

设置

d = {1: np.array([2,3]), 2: np.array([8,4,5]), 3: np.array([6,7,8,9])}

答案 2 :(得分:2)

这是我的版本:

(pd.DataFrame.from_dict(d, orient='index').rename_axis('A')
                                          .stack()
                                          .reset_index(name='B')
                                          .drop('level_1', axis=1)
                                          .astype('int'))
Out[63]: 
   A  B
0  1  2
1  1  3
2  2  8
3  2  4
4  2  5
5  3  6
6  3  7
7  3  8
8  3  9