Pandas 在给定键值数据帧的情况下填充密集数据帧

Pandas 在给定键值数据帧的情况下填充密集数据帧,pandas,Pandas,我有一个键值数据框: pd.DataFrame(columns=['X','Y','val'],data= [['a','z',5],['b','g',3],['b','y',6],['e','r',9]]) > X Y val 0 a z 5 1 b g 3 2 b y 6 3 e r 9 X z g y r 0 a 5 0 0 0 1 b 0 3 6 0 2 e 0 0 0 9 我想将其转换为更密集的数据帧:

我有一个键值数据框:

pd.DataFrame(columns=['X','Y','val'],data= [['a','z',5],['b','g',3],['b','y',6],['e','r',9]])
>    X Y val
   0 a z   5
   1 b g   3
   2 b y   6
   3 e r   9
     X z g y r
   0 a 5 0 0 0
   1 b 0 3 6 0
   2 e 0 0 0 9
我想将其转换为更密集的数据帧:

pd.DataFrame(columns=['X','Y','val'],data= [['a','z',5],['b','g',3],['b','y',6],['e','r',9]])
>    X Y val
   0 a z   5
   1 b g   3
   2 b y   6
   3 e r   9
     X z g y r
   0 a 5 0 0 0
   1 b 0 3 6 0
   2 e 0 0 0 9
在我求助于纯python之前,我想知道是否有一种简单的方法可以对熊猫做到这一点

您可以使用:

然后通过val列:

In [13]: res = dummies.mul(df['val'], axis=0)

In [14]: res
Out[14]: 
   g  r  y  z
0  0  0  0  5
1  3  0  0  0
2  0  0  6  0
3  0  9  0  0
要修复索引,只需添加X作为此索引,您可以首先应用set_index:

In [21]: df1 = df.set_index('X', append=True)

In [22]: df1
Out[22]: 
     Y  val
  X        
0 a  z    5
1 b  g    3
2 b  y    6
3 e  r    9

In [23]: dummies = pd.get_dummies(df['Y'])

In [24]: dummies.mul(df['val'], axis=0)
Out[24]: 
     g  r  y  z
  X            
0 a  0  0  0  5
1 b  3  0  0  0
2 b  0  0  6  0
3 e  0  9  0  0
如果要执行此操作(也可以使用pivot_table):

也许您想重置索引,使X成为一列(我不确定than是否有意义):

为完整起见,以下文件:

注意:在重置索引后,列名被命名为Y,不确定这是否有意义(并且很容易通过
res.columns.name=None
进行更正)。

您可以使用:

然后通过val列:

In [13]: res = dummies.mul(df['val'], axis=0)

In [14]: res
Out[14]: 
   g  r  y  z
0  0  0  0  5
1  3  0  0  0
2  0  0  6  0
3  0  9  0  0
要修复索引,只需添加X作为此索引,您可以首先应用set_index:

In [21]: df1 = df.set_index('X', append=True)

In [22]: df1
Out[22]: 
     Y  val
  X        
0 a  z    5
1 b  g    3
2 b  y    6
3 e  r    9

In [23]: dummies = pd.get_dummies(df['Y'])

In [24]: dummies.mul(df['val'], axis=0)
Out[24]: 
     g  r  y  z
  X            
0 a  0  0  0  5
1 b  3  0  0  0
2 b  0  0  6  0
3 e  0  9  0  0
如果要执行此操作(也可以使用pivot_table):

也许您想重置索引,使X成为一列(我不确定than是否有意义):

为完整起见,以下文件:


注意:在重置索引后,列名被命名为Y,不确定这是否有意义(并且很容易通过
res.columns.name=None
进行更正)。

如果您想要更直接的内容。类似于
DataFrame.lookup
但对于np.put可能有意义

def lookup_index(self, row_labels, col_labels):
    values = self.values
    ridx = self.index.get_indexer(row_labels)
    cidx = self.columns.get_indexer(col_labels)
    if (ridx == -1).any():
        raise ValueError('One or more row labels was not found')
    if (cidx == -1).any():
        raise ValueError('One or more column labels was not found')
    flat_index = ridx * len(self.columns) + cidx
    return flat_index

flat_index = lookup_index(df, vals.X, vals.Y)
np.put(df.values, flat_index, vals.val.values)

这假设
df
具有适当的列和索引来保存X/Y值。如果你想要感觉更直接的东西,这里有一个ipython笔记本。类似于
DataFrame.lookup
但对于np.put可能有意义

def lookup_index(self, row_labels, col_labels):
    values = self.values
    ridx = self.index.get_indexer(row_labels)
    cidx = self.columns.get_indexer(col_labels)
    if (ridx == -1).any():
        raise ValueError('One or more row labels was not found')
    if (cidx == -1).any():
        raise ValueError('One or more column labels was not found')
    flat_index = ridx * len(self.columns) + cidx
    return flat_index

flat_index = lookup_index(df, vals.X, vals.Y)
np.put(df.values, flat_index, vals.val.values)

这假设
df
具有适当的列和索引来保存X/Y值。这是一个ipython笔记本

不需要
B00
的空行,就可以轻松获得它;这很重要吗?6应该在第2行而不是第1行吗?修复了第2行,这是一个打字错误!谢谢你指出这一点!不需要空行
b0
,就可以轻松地获得此信息;这很重要吗?6应该在第2行而不是第1行吗?修复了第2行,这是一个打字错误!谢谢你指出这一点!嗯。使用
get_dummies
保留OP想要的所有行,但不将3和6放在同一行中
.pivot(“X”、“Y”).fillna(0)
将3和6放在同一行中,但丢失0行。我不确定哪一个更接近OP的目标。嗯,这个定位看起来是错误的。我缺少的是df['X']列是indexYeah的一部分,我想这可能是OP的一个错误+1无论如何。(^):)我明白你的意思。是的,这取决于他们想要什么。如果这是OP写的东西,他们应该扔掉第一个索引(因为这没有多大意义)…是的,很抱歉没有弄清楚-我一直在寻找的数据透视表。。。忘了那些。然而,在测试了
get_dummies
之后,这对于我需要使用的东西来说效果更好。非常感谢。嗯。使用
get_dummies
保留OP想要的所有行,但不将3和6放在同一行中
.pivot(“X”、“Y”).fillna(0)
将3和6放在同一行中,但丢失0行。我不确定哪一个更接近OP的目标。嗯,这个定位看起来是错误的。我缺少的是df['X']列是indexYeah的一部分,我想这可能是OP的一个错误+1无论如何。(^):)我明白你的意思。是的,这取决于他们想要什么。如果这是OP写的东西,他们应该扔掉第一个索引(因为这没有多大意义)…是的,很抱歉没有弄清楚-我一直在寻找的数据透视表。。。忘了那些。然而,在测试了
get_dummies
之后,这对于我需要使用的东西来说效果更好。非常感谢。