【问题标题】:Pandas dataframe filter vectorized熊猫数据框过滤器矢量化
【发布时间】:2018-02-05 23:59:31
【问题描述】:

我有一个像这样的 DataFrame:

a = date       | user | value
    -------------------------
    2017-05-01 | AAA  | 1
    2017-05-02 | AAA  | 2
    ...        | AAA  | ...
    2017-08-31 | AAA  | 1.7
    2017-05-01 | BBB  | 1.5
    2017-05-02 | BBB  | 3
    ...        | BBB  | ...
    2017-08-31 | BBB  | 2.7

另外,我有一个这样的列表:

b = start_date | user
    -----------------
    2017-05-02 | AAA
    2017-05-05 | AAA
    2017-05-03 | BBB

我现在想从 a 中提取一个 3 维矩阵,该矩阵包含从 b 中给定的 start_date 开始的 3 个下一个日期列表,用于 b 中给定的用户。所以在上面的例子中:

[
[[2017-05-02, AAA, 2], [2017-05-03, AAA, x], [2017-05-04, AAA, x]],
[[2017-05-05, AAA, 2], [2017-05-06, AAA, x], [2017-05-07, AAA, x]],
[[2017-05-03, BBB, 2], [2017-05-04, BBB, x], [2017-05-05, BBB, x]],
]

x 代表随机值,我只是懒得把所有例子都写下来。

我正在使用 Python 3.5。提前非常感谢。我期待您的聪明答案:-)

【问题讨论】:

  • 您能否设置您的数据框,以便它们可以复制和粘贴,就像它们显示在here 一样,并且结构 b 也正确。这不是列表的设置方式。

标签: python pandas numpy python-3.5


【解决方案1】:

试试这个 .. 还可以查看link 关于“如何制作好的可重现 pandas 示例”

DF=pd.merge(df1,df2,on='user',how='outer')
DF['DIFF']=DF['date_x']-DF['date_y']
DF=DF.loc[(DF.DIFF/np.timedelta64(1, 'D')>=0)&(DF.DIFF/np.timedelta64(1, 'D')<=2),:]
DF.drop('DIFF',1).groupby([DF.index.get_level_values(0),'date_y'])['date_x','user','value'].\
   apply(lambda x :x.values.tolist()).values.tolist()

Out[760]: 
[[[Timestamp('2017-05-02 00:00:00'), 'AAA  ', 2.0],
  [Timestamp('2017-05-03 00:00:00'), 'AAA  ', 2.0],
  [Timestamp('2017-05-04 00:00:00'), 'AAA  ', 2.0]],
 [[Timestamp('2017-05-05 00:00:00'), 'AAA  ', 2.0],
  [Timestamp('2017-05-06 00:00:00'), 'AAA  ', 2.0],
  [Timestamp('2017-05-07 00:00:00'), 'AAA  ', 1.7]],
 [[Timestamp('2017-05-03 00:00:00'), 'BBB  ', 3.0],
  [Timestamp('2017-05-04 00:00:00'), 'BBB  ', 3.0],
  [Timestamp('2017-05-05 00:00:00'), 'BBB  ', 3.0]]]

数据输入


df1
Out[748]:
         date   user  value
0  2017-05-01  AAA      1.0
1  2017-05-02  AAA      2.0
2  2017-05-03  AAA      2.0
3  2017-05-04  AAA      2.0
4  2017-05-05  AAA      2.0
5  2017-05-06  AAA      2.0
6  2017-05-07  AAA      1.7
7  2017-05-01  BBB      1.5
8  2017-05-02  BBB      3.0
9  2017-05-03  BBB      3.0
10 2017-05-04  BBB      3.0
11 2017-05-05  BBB      3.0

df2
Out[749]: 
        date   user
0 2017-05-02  AAA  
1 2017-05-05  AAA  
2 2017-05-03  BBB  

【讨论】:

  • 感谢您的帮助。以后我会注意构建正确的 pandas 数据框。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2015-05-07
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2020-10-02
  • 2022-01-17
相关资源
最近更新 更多