0

したがって、理想的なデータ フレームは、要素c1とのすべての可能な組み合わせで構成されc2ます。

>>> c1 = ['a','a','b','b']
>>> c2 = list('xy'*2)
>>> val = np.random.rand(4)

>>> df_ideal = pd.DataFrame({'c1':c1, 'c2':c2, 'val':val})
>>> df_ideal
 c1 c2       val
0  a  x    0.277162
1  a  y    0.324269
2  b  x    0.156026
3  b  y    0.435033

ただし、組み合わせのいずれかが欠落するかどうかは事前にわからないため、次のようなデータ フレームになる可能性があります (組み合わせb xが欠落しています)。

>>> df
  c1 c2       val
0  a  x    0.277162
1  a  y    0.324269
3  b  y    0.435033

これが発生した場合、欠落している組み合わせvalが 0 になるようにします。

>>> df_desired
   c1 c2       val
0  a  x    0.277162
1  a  y    0.324269
2  b  x    0
3  b  y    0.435033

これを行う 1 つの方法はa、 、bwithのすべての組み合わせを含むデータ フレームを作成しxyそれらすべてに 0 を割り当てることです。

>>> df_empty
   c1 c2  val
0  a  x    0
1  a  y    0
2  b  x    0
3  b  y    0

次に、データ フレーム を読み取った後、dfpandas に使用可能な要素をvalの適切な行df_empty(0.277162に対応する行a x、に対応0.324269する行a y、に対応0.435033する行b y) に挿入するように指示できます。これは私にdf_desired.

パンダでこれを行うことは可能ですか?

4

2 に答える 2

1

あなたのデータはc1とのc2値によって実際にインデックス付けされているようです。その場合は、データ構造を MultiIndex を持つ Series にしてから、それを使用して必要な値を挿入する必要があります。

c1 = ['a','a','b','b']
c2 = list('xy'*2)
val = pandas.Series(0, index=pandas.MultiIndex.from_tuples(zip(c1, c2)))
>>> val
a  x    0
   y    0
b  x    0
   y    0
dtype: int64

それで:

>>> val.ix['a', 'x'] = 100
>>> val
a  x    100
   y      0
b  x      0
   y      0
dtype: int64

値の列が複数ある場合 (1 つのval列だけでなく)、同じ方法で MultiIndex を使用して DataFrame を作成できます。

于 2013-09-09T18:48:10.513 に答える
0

df_empty と df の間で左マージを実行してから、0 で埋めることができます。

df = pd.DataFrame({'c1':['a','a','b'], 'c2':['x','y','y'], 'val':[0.277162, 0.324269, 0.435033]})
df_empty = pd.DataFrame({'c1':['a','a','b','b'], 'c2':['x','y','x','y']})
df_desired = pd.merge(df_empty, df, on =('c1','c2'), how='left', copy = True)
df_desired = df_desired.fillna(0)
print df_desired

   c1 c2       val
0  a  x  0.277162
1  a  y  0.324269
2  b  x  0.000000
3  b  y  0.435033
于 2013-12-24T23:12:18.393 に答える