我正在尝试选择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:必须为无法解释的表达道歉,这是我在这里的第一篇文章。我会再尝试。
因此,问题是:存在一个由用户ID索引的数据框。每个用户ID最多可以有N个对应的数据帧行(列为:“ etime”,“ requested”,“ rejected”),其中“ etime”基本上是关键。对于某些“用户标识”,存在所有N个对应的条目,但对于大多数“用户ID”,某些“ etime”缺少条目。
我的意图是:为每个'userid'构造一个显式的DataFrame对象,其中包含由'etime'索引的所有N个条目,并为缺失的条目填充零。这就是为什么我将索引更改为“ etime”,然后用完整的“ etime”范围为选定的行子集重新编制索引的原因。
问题是:对于某些“用户标识”,恰好有一个对应的“ etime”,为此,.loc()子集返回的数据帧不是由“用户标识”索引的一行,而是返回由数组索引的一系列对象:

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

最佳答案

因此,从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))

关于python - Pandas 按标签选择。单行输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24909906/

10-12 19:13