大熊猫。按标签选择。单行输出

时间:2014-07-23 11:58:07

标签: python pandas

我试图选择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

2 个答案:

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

希望它有所帮助。如果没有,请澄清你想要实现的目标