2

ここで説明したものと同様の質問があり ます numpy 配列の連結辞書 (可能であれば手動ループを回避します)

辞書キーを手動でループする必要を避けながら、任意のサイズの numpy 配列を含む 2 つの Python 辞書の値を連結する方法を探しています。例えば:

import numpy as np

# Create first dictionary
n1 = 3
s = np.random.randint(1,101,n1)
n2 = 2
r = np.random.rand(n2)
d = {"r":r,"s":s}
print "d = ",d

# Create second dictionary
n3 = 1
s = np.random.randint(1,101,n3)
n4 = 3
r = np.random.rand(n4)
d2 = {"r":r,"s":s}
print "d2 = ",d2

# Some operation to combine the two dictionaries...
d = SomeOperation(d,d2)

# Updated dictionary
print "d3 = ",d

出力を与える

>> d =  {'s': array([75, 25, 88]), 'r': array([ 0.1021227 ,  0.99454874])}
>> d2 =  {'s': array([78]), 'r': array([ 0.27610587,  0.57037473, 0.59876391])}
>> d3 =  {'s': array([75, 25, 88, 78]), 'r': array([ 0.1021227 ,  0.99454874, 0.27610587,  0.57037473, 0.59876391])}

つまり、キーが既に存在する場合、そのキーの下に格納されている numpy 配列が追加されます。

パッケージ pandas を使用した前の説明で提案されたソリューションは、同じ長さ (n1=n2 および n3=n4) の配列を必要とするため機能しません。

for遅い手動ループの使用を最小限に抑えながら、これを行う最善の方法を知っている人はいますか? (結合したい辞書には何百ものキーがある可能性があるため、ループを避けたいと思います)。

ありがとう(非常に明確な質問を作成してくれた「Aim」にも)!

4

1 に答える 1

1

1 つの方法は、シリーズの辞書を使用することです (つまり、値は配列ではなくシリーズです)。

In [11]: d2
Out[11]: {'r': array([ 0.3536318 ,  0.29363604,  0.91307454]), 's': array([46])}

In [12]: d2 = {name: pd.Series(arr) for name, arr in d2.iteritems()}

In [13]: d2
Out[13]:
{'r': 0    0.353632
1    0.293636
2    0.913075
dtype: float64,
 's': 0    46
dtype: int64}

そうすれば、それを DataFrame コンストラクターに渡すことができます。

In [14]: pd.DataFrame(d2)
Out[14]:
          r   s
0  0.353632  46
1  0.293636 NaN
2  0.913075 NaN
于 2013-05-03T14:08:17.660 に答える