Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫按组检查未来状况_Python_Pandas - Fatal编程技术网

Python 熊猫按组检查未来状况

Python 熊猫按组检查未来状况,python,pandas,Python,Pandas,我试图通过在数据中的未来日期是否出现条件来标记每一行。这种情况过去是否发生过并不重要。此外,我正在尝试按组执行此标记 一个直观的思考方式是,是否有人会在未来的某个日期购买裤子 id date item 1 2000-01-01 'foo' 1 2000-01-02 'pants' 1 2000-01-03 'bar' 2 2000-01-02 'organ' 2 2000-02-01 'beef' 3

我试图通过在数据中的未来日期是否出现条件来标记每一行。这种情况过去是否发生过并不重要。此外,我正在尝试按组执行此标记

一个直观的思考方式是,是否有人会在未来的某个日期购买裤子

id      date        item
1    2000-01-01     'foo'
1    2000-01-02     'pants'
1    2000-01-03     'bar'
2    2000-01-02     'organ'
2    2000-02-01     'beef'
3    2000-01-01     'pants'
3    2000-01-10     'oranges'
3    2000-02-20     'pants'
反过来会变成:

id      date        item      will_buy_pants
1    2000-01-01     'foo'          1
1    2000-01-02     'pants'        0
1    2000-01-03     'bar'          0
2    2000-01-02     'organ'        0
2    2000-02-01     'beef'         0
3    2000-01-01     'pants'        1
3    2000-01-10     'oranges'      1
3    2000-02-20     'pants'        0
编辑:
这不是一个预测问题。是否有人会买裤子已经在数据中表达出来了。我只想在每一排都挂一面旗子。

啊,我很抱歉——今天我很疏忽。所以这是有效的,我想你想做什么就做什么,使用pandas groupby和apply

首先,生成第二个数据帧,其中包含两个索引-item和id,以及每个组合的最大日期:

gd = pd.DataFrame(df.groupby(['item','id'])['date'].max())
这就是此数据帧的外观:

In [5]: gd
Out[5]: 
                   date
item      id           
'bar'     1  2000-01-03
'beef'    2  2000-02-01
'foo'     1  2000-01-01
'oranges' 3  2000-01-10
'organ'   2  2000-01-02
'pants'   1  2000-01-02
          3  2000-02-20
使用groupby定义一个函数,检查它是否在将来购买。它有两个参数-数据帧的行和上面分组的数据帧。您可以在每个函数调用内部进行分组,也可以将其移动到外部

def check_pants(row,gd):
    if row.id in gd.loc["'pants'"].index.values and \
        row.date < gd.loc["'pants'",row.id].date:
            return 1
    else:
        return 0
抱歉,我做了这么多编辑。

安装程序 解决方案 我正在使用嵌套的
apply

def check_future_pants(x, df):
    date_condition = x.date < df.date
    pant_condition = df.item == "'pants'"
    return (date_condition & pant_condition).any()

def check_df_pants(df):
    return df.apply(lambda x: check_future_pants(x, df), axis=1)

df['will_buy_pants'] = df.groupby('id', group_keys=False).apply(check_df_pants)
这适用于一个组,但我所做的检查适用于
数据帧
,因此我使用另一个检查功能
check\u df\u pants
执行嵌套的
apply

df['will_buy_pants'] = df.groupby('id', group_keys=False).apply(check_df_pants)
pring df

   id       date       item will_buy_pants
0   1 2000-01-01      'foo'           True
1   1 2000-01-02    'pants'          False
2   1 2000-01-03      'bar'          False
3   2 2000-01-02    'organ'          False
4   2 2000-02-01     'beef'          False
5   3 2000-01-01    'pants'           True
6   3 2000-01-10  'oranges'           True
7   3 2000-02-20    'pants'          False

是否要随机分配
0
1
?;)你有什么预测算法吗?@MaxU看起来像是如果“item”列在后续索引上有“pants”,1。当你看到裤子时重新开始。最后一个应该是零。@ayhan,我不确定。。。所以,让我们等到事情弄清楚,或者有人会猜到OP真正想要什么;)很抱歉我认为我的表述不清楚。我只是想看看未来的行来解决这个问题。我没有使用分类器。在本例中,我们讨论的是函数check\u if\u will\u buy\u pants中的代码。例如,您可以按项目分组并检查行数,即,如果大于1,则它将在将来购买。这样行吗?我可以更改函数以反映它。
def check_future_pants(x, df):
    date_condition = x.date < df.date
    pant_condition = df.item == "'pants'"
    return (date_condition & pant_condition).any()

def check_df_pants(df):
    return df.apply(lambda x: check_future_pants(x, df), axis=1)

df['will_buy_pants'] = df.groupby('id', group_keys=False).apply(check_df_pants)
# Let's start with a sub-group
df1 = df[df.id == 1].copy()

print df1.apply(lambda x: check_future_pants(x, df1), axis=1)

0     True
1    False
2    False
dtype: bool
df['will_buy_pants'] = df.groupby('id', group_keys=False).apply(check_df_pants)
pring df

   id       date       item will_buy_pants
0   1 2000-01-01      'foo'           True
1   1 2000-01-02    'pants'          False
2   1 2000-01-03      'bar'          False
3   2 2000-01-02    'organ'          False
4   2 2000-02-01     'beef'          False
5   3 2000-01-01    'pants'           True
6   3 2000-01-10  'oranges'           True
7   3 2000-02-20    'pants'          False