2017-05-11 10 views
4

私はdictを持っています。値はリストです。この例では値が可変長リストであるdictからデータフレームを作成する

my_dict = {1: [964725688, 6928857], 
      ... 

      22: [1667906, 35207807, 685530997, 35207807], 
      ... 
      } 

、リスト内の最大項目は4であるが、それはより大きくなり得ます。

私のようなデータフレームに変換したいと思います:

1 964725688 
1 6928857 
... 
22 1667906 
22 35207807 
22 685530997 
22 35207807 
+0

多少の違いがあります。その質問には、リストに一定数の項目があり、私の場合、リストにはさまざまな項目があります。 – spitfiredd

+0

[データフレームへの値リストの辞書の変換]の可能な複製(http://stackoverflow.com/questions/25292568/converting-a-dictionary-with-lists-for-values-into-a-dataframe) –

答えて

1
#Load dict directly to a Dataframe without loops 
df=pd.DataFrame.from_dict(my_dict,orient='index') 

#Unstack, drop na and sort if you need. 
df.unstack().dropna().sort_index(level=1) 
Out[382]: 
0 1  964725688.0 
1 1  6928857.0 
0 22  1667906.0 
1 22  35207807.0 
2 22 685530997.0 
3 22  35207807.0 
dtype: float64 
+0

私のソリューションはこれに似ています。 – spitfiredd

3
my_dict ={1: [964725688, 6928857], 22: [1667906, 35207807, 685530997, 35207807]} 

df = pd.DataFrame([ [k,ele] for k,v in my_dict.iteritems() for ele in v ]) 

print df 

    0 1   
0 1 964725688 
1 1 6928857 
2 22 1667906 
3 22 35207807 
4 22 685530997 
5 22 35207807 
+0

うまくいった。 =) – Moondra

+0

これは素晴らしい解決策です! – hjmnzs

2

最初のアイデア
pandas

s = pd.Series(my_dict) 
pd.Series(
    np.concatenate(s.values), 
    s.index.repeat(s.str.len()) 
) 

1  964725688 
1  6928857 
22  1667906 
22  35207807 
22 685530997 
22  35207807 
dtype: int64 

高速化!zipreduceを用いた機能側にやや
numpy

values = list(my_dict.values()) 
lens = [len(value) for value in values] 
keys = list(my_dict.keys()) 
pd.Series(np.concatenate(values), np.repeat(keys, lens)) 

1  964725688 
1  6928857 
22  1667906 
22  35207807 
22 685530997 
22  35207807 
dtype: int64 

注目
pd.concat

pd.concat({k: pd.Series(v) for k, v in my_dict.items()}).reset_index(1, drop=True) 

1  964725688 
1  6928857 
22  1667906 
22  35207807 
22 685530997 
22  35207807 
dtype: int64 
1

from functools import reduce # if working with Python3 
import pandas as pd 


d = {1: [964725688, 6928857], 22: [1667906, 35207807, 685530997, 35207807]} 

df = pd.DataFrame(reduce(lambda x,y: x+y, [list(zip([k]*len(v), v)) for k,v in d.items()])) 

print(df) 

#  0   1 
# 0 1 964725688 
# 1 1 6928857 
# 2 22 1667906 
# 3 22 35207807 
# 4 22 685530997 
# 5 22 35207807 

We zipレコードを作成するためのキーと値(reduce操作で拡張)。レコードは次にpd.DataFrame関数に渡されます。

こちらがお役に立てば幸いです。

関連する問題