我试图选择pandas DataFrame D中的每个条目,对某些特定用户ID进行对应,用零填充缺少的etime值,如下所示:
user_entries = D.loc[userid]
user_entries.index = user_entries.etime
user_entries = user_entries.reindex(range(distinct_time_entries_num))
user_entries = user_entries.fillna(0)
问题是,对于某些ID,只存在一个条目,因此.loc()方法返回一个带有意外索引的Series对象:
(Pdb) user_entries.index = user_entries.etime
*** TypeError: Index(...) must be called with a collection of some kind, 388 was passed
(Pdb) user_entries
etime 388
requested 1
rejected 0
Name: 351, dtype: int64
(Pdb) user_entries.index
Index([u'etime', u'requested', u'rejected'], dtype='object')
处理起来很痛苦。我非常喜欢一行的DataFrame对象。它有什么办法吗?感谢。
UPD:A不得不为不合情理的表述道歉,这是我在这里发表的第一篇文章。我会再试一次。 所以交易是:有一个数据框,由userid索引。每个用户ID最多可能包含N个相应的数据帧行(列数为:' etime',' eti;'''拒绝'),其中' ETIME'基本上是关键。对于某些“用户ID”,存在所有N个对应的条目,但对于大多数条目,某些“时间”缺少条目。 我的意图是:对于每个用户ID'构造一个显式的DataFrame对象,包含由' etime'索引的所有N个条目,用缺少的条目填充零。这就是为什么我要将索引更改为“etime”'然后使用完整的“etime”重新索引选定的行子集。范围。 问题是:对于某些用户ID'只有一个相应的“etime'”,其中.loc()子集不返回一个数据帧,其中一行由' userid'但是由数组索引的系列对象:Index([u'etime', u'requested', u'rejected'], dtype='object')
这就是改变索引失败的原因。每次选择一些数据帧子集时检查维度和索引看起来都很难看。我还能做些什么呢?
UPD2:这是演示案例的脚本
full_etime_range = range(10)
df = DataFrame(index=[0,0,1],
columns=['etime','requested'],
data=[[0,1],[1,1],[1,1]])
for i in df.index:
tmp = df.loc[i]
tmp.index = tmp['etime']
tmp = tmp.reindex(full_etime_range,fill_value = 0)
print tmp
答案 0 :(得分:1)
因此,从df
作为您的数据框开始,我们可以安全地执行以下操作:
In[215]: df.set_index([df.index, 'etime'], inplace=True)
In[216]: df
Out[216]:
requested
etime
0 0 1
1 1
1 1 1
DF = pd.DataFrame(index=full_etime_range, columns=[])
df0 = DF.copy()
In[225]: df0.join(df.loc[0])
Out[225]:
requested
0 1
1 1
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
In[230]: df1 = DF.copy()
In[231]: df1.join(df.loc[1])
Out[231]:
requested
0 NaN
1 1
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
这在技术上是你想要的。但是,我们可以做得更好:
listOfDf = [DF.copy().join(df.loc[i]) for i in df.index.get_level_values(1).unique()]
我想甚至更好一级,但以下不起作用 - 也许有人可以说明原因。
df.groupby(level=0).apply(lambda x: DF.copy().join(x))
答案 1 :(得分:0)
你只是想填补鼻子吗?为什么要重新编制数据帧索引?
只需
user_entries = D.loc[userid]
user_entries.fillna(0)
应该做的伎俩。但是,如果你愿意为etime领域做准备,你应该做的是:
user_entries = D.loc[userid]
temp = user_entries["etime"].fillna(0)
user_extries["etime"] = temp
希望它有所帮助。如果没有,请澄清你想要实现的目标