Python 如何替换已构建的数据帧中的值(熊猫)?

Python 如何替换已构建的数据帧中的值(熊猫)?,python,replace,pandas,dataframe,Python,Replace,Pandas,Dataframe,因此,一个理想的数据框架将包括所有可能的因素组合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

因此,一个理想的数据框架将包括所有可能的因素组合
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
然而,我不知道是否有任何组合会丢失,因此我可能会得到这样的数据帧(组合
bx
丢失):

如果发生这种情况,那么我希望丢失的组合接收0的
val

>>> df_desired
   c1 c2       val
0  a  x    0.277162
1  a  y    0.324269
2  b  x    0
3  b  y    0.435033
一种方法是创建一个数据框,其中包含
a
b
x
y
的所有组合,并将0分配给所有组合:

>>> 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\u empty
0.277162
对应于
a x
的行中,
0.324269
对应于
a y
的行中,
0.435033
对应于
b y
的行中)。这将为我提供所需的
dfu


在pandas中可以这样做吗?

看起来您的数据实际上是由
c1
c2
值索引的。如果是这样,您应该将您的数据结构设置为具有多索引的系列,然后使用多索引插入所需的值

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
column),您可以用相同的方法使用多索引创建数据帧。

您可以在df_empty和df之间进行左合并,然后用0填充NA:

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

不完全是。有时可能是第9行,有时是第3行。这取决于用户未能响应的内容。但列的组合总是相同的,即(a b)与(x y)与(G1 G2)的所有可能组合。这就是为什么我想到创建一个空数据框,然后告诉pandas用用户提供的值填充。@HappyPy:您需要提供更多关于“用户提供的值”的信息。您如何知道要替换哪一行?如果用户在
x
行中提供了一个项,您可以使用
df.ix[x,'val']
在表中的该位置插入一个值。@happy您希望追加而不是替换吗?@Andy Hayden:您如何使用append进行操作?如果读取“df”时,它恰好包含“a x G2 0.277162”,那么这应该取代我创建的空数据框中的“a x G2 0”。追加会有这种效果吗?@Andy Hayden:我从头开始编辑了整个问题。它更有意义吗?
>>> val.ix['a', 'x'] = 100
>>> val
a  x    100
   y      0
b  x      0
   y      0
dtype: int64
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