0

因此,理想的数据框将包含所有可能的因素组合c1c2

>>> 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

如果发生这种情况,那么我希望缺少的组合收到val0。

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

一种方法是创建一个数据框,其中包含 、 with 的所有组合ab并将x0y分配给所有这些组合:

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

然后,在读取数据框之后df,我可以告诉 pandas 将可用元素插入到(对应的行中、对应的行和对应的val行中)的适当行中。这会给我.df_empty0.277162a x0.324269a y0.435033b ydf_desired

可以在熊猫中做到这一点吗?

4

2 回答 2

1

看来您的数据确实由c1andc2值索引。如果是这样,您应该将您的数据结构设为具有 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

如果您有多列值(不仅仅是一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 回答