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
之后,这对于我需要使用的东西来说效果更好。非常感谢。