【问题标题】:Construct sequences from a dataframe using dictionaries in Python使用 Python 中的字典从数据帧构造序列
【发布时间】:2016-12-26 19:41:47
【问题描述】:

我想使用 Python 中的字典构建用户购买历史的序列。我希望这些序列按日期排序。

我的数据框中有 3 列:

users        items         date

1             1            date_1 
1             2            date_2
2             1            date_3
2             3            date_1
4             5            date_2
4             1            date_5
4             3            date_3

结果应该是这样的:

{1: [[1,date_1],[2,date_2]], 2:[[3,date_1],[5,date_2],[1,date_3]], 4:[[5,date_2],[3,date_3][1,date_5]]}

我的代码是:

df_sub = df[['uid', 'nid', 'date']] 
dic3 = df_sub.set_index('uid').T.to_dict('list')

我的结果是:

{36864: [258509L, '2014-12-03'], 548873: [502105L, '2015-09-08'], 42327: [492268L, '2015-01-29'], 548873: [370049L, '2015-02-18'], 36864: [258909L, '2016-01-13'] ... }

但我想按用户分组:

 {36864: [[258509L, '2014-12-03'],[258909L, '2016-01-13']], 548873: [[502105L, '2015-09-08'],[370049L, '2015-02-18']], 42327: [492268L, '2015-01-29'] }

请帮忙!

【问题讨论】:

  • 那么你的代码在哪里,它到底有什么问题?
  • 我的代码是df_sub = df[['uid', 'nid', 'date']] dic3 = df_sub.set_index('uid').T.to_dict('list') 我的结果是:{36864: [258509L, '2014-12-03'], 548873: [502105L, '2015-09-08'], 42327: [492268L, '2015-01-29'], 30732: [370049L, '2015-02-18'], 34830: [258909L, '2016-01-13'] ... } 我喜欢按用户分组
  • edit提供minimal reproducible example的问题。
  • 感谢@jonrsharpe 的建议,这是我第一次在这个论坛上提问。

标签: python pandas dictionary dataframe sequences


【解决方案1】:

首先,将 users 设置为索引并执行groupby w.r.t。然后,您可以传递一个函数以按其 date 列对每个组进行排序,并使用 .values 提取其底层数组部分。

使用.tolist 取回它的list 等价物。这为您提供了所需的格式。最后,使用.to_dict 将您的最终输出作为字典。

fnc = lambda x: x.sort_values('date').values.tolist()
df.set_index('users').groupby(level=0).apply(fnc).to_dict()

产生:

{1: [[1, 'date_1'], [2, 'date_2']],
 2: [[3, 'date_1'], [1, 'date_3']],
 4: [[5, 'date_2'], [3, 'date_3'], [1, 'date_5']]}

【讨论】:

  • 也许我会回到一个封闭的问题,但我想知道如何更改函数以仅考虑列表中按日期排序的 ID,而不考虑日期。
  • 像这样例如 {1: [1, 2], 2: [3, 1,], 4: [5, 3, 1]}
猜你喜欢
  • 2019-08-12
  • 2020-09-06
  • 2017-09-04
  • 2022-12-13
  • 1970-01-01
  • 2015-10-25
  • 2017-10-01
  • 2016-04-28
  • 1970-01-01
相关资源
最近更新 更多