Python 如何根据另一列的值移动一列?

Python 如何根据另一列的值移动一列?,python,machine-learning,indexing,Python,Machine Learning,Indexing,我有这样一个数据框: 我想做一个“标志”列,它将单独地发现每个RB的“值”列中的变化,并且仅当值增加时,将其放在变化前一个月,当值增加时,但仅当前一个月的RB与变化月份相同时。所以我想,轮班是没办法的。 我也想做一个类似的列,但当一个RB的值增加时,我在前一个月(如上一列)、前两个月和前三个月加上1,如果变化的月份和所有这三个月都有相同的RB,则规则保持不变。 这应该可以满足您的需求: import pandas as pd data = [ {"rb": 11

我有这样一个数据框:

我想做一个“标志”列,它将单独地发现每个RB的“值”列中的变化,并且仅当值增加时,将其放在变化前一个月,当值增加时,但仅当前一个月的RB与变化月份相同时。所以我想,轮班是没办法的。

我也想做一个类似的列,但当一个RB的值增加时,我在前一个月(如上一列)、前两个月和前三个月加上1,如果变化的月份和所有这三个月都有相同的RB,则规则保持不变。

这应该可以满足您的需求:

import pandas as pd

data = [
    {"rb": 111, "date": "01/01/2020", "value": 5},
    {"rb": 111, "date": "01/02/2020", "value": 5},
    {"rb": 111, "date": "01/03/2020", "value": 4},
    {"rb": 111, "date": "01/04/2020", "value": 6},
    {"rb": 111, "date": "01/05/2020", "value": 6},
    {"rb": 111, "date": "01/06/2020", "value": 6},
    {"rb": 111, "date": "01/07/2020", "value": 6},
    {"rb": 111, "date": "01/08/2020", "value": 7},
    {"rb": 112, "date": "01/01/2020", "value": 3},
    {"rb": 112, "date": "01/02/2020", "value": 3},
    {"rb": 112, "date": "01/03/2020", "value": 4},
    {"rb": 112, "date": "01/04/2020", "value": 4},
    {"rb": 112, "date": "01/05/2020", "value": 5},
    {"rb": 112, "date": "01/06/2020", "value": 5},
    {"rb": 112, "date": "01/07/2020", "value": 5},
    {"rb": 112, "date": "01/08/2020", "value": 5},
    {"rb": 111, "date": "01/01/2020", "value": 18},
    {"rb": 111, "date": "01/02/2020", "value": 18},
    {"rb": 111, "date": "01/03/2020", "value": 17},
    {"rb": 111, "date": "01/04/2020", "value": 11},
    {"rb": 111, "date": "01/05/2020", "value": 13},
    {"rb": 111, "date": "01/06/2020", "value": 13},
    {"rb": 111, "date": "01/07/2020", "value": 13},
    {"rb": 111, "date": "01/08/2020", "value": 13},
    {"rb": 112, "date": "01/01/2020", "value": 14},
    {"rb": 112, "date": "01/02/2020", "value": 14},
    {"rb": 112, "date": "01/03/2020", "value": 17},
    {"rb": 112, "date": "01/04/2020", "value": 17},
    {"rb": 112, "date": "01/05/2020", "value": 5},
    {"rb": 112, "date": "01/06/2020", "value": 5},
    {"rb": 112, "date": "01/07/2020", "value": 5}
]

df = pd.DataFrame(data)
df["flag"] = 0
for index in range(len(df) - 1):
    df.loc[index, "flag"] = int(df.loc[index, "rb"] == df.loc[index + 1, "rb"] and
                                df.loc[index, "value"] < df.loc[index + 1, "value"])

df["flag_3m"] = 0
for index in range(len(df)):
    try:
        df.loc[index, "flag_3m"] = int(df.loc[index, "flag_3m"] != 1 and
           ((df.loc[index, "value"] < df.loc[index + 1, "value"] and df.loc[index, "rb"] == df.loc[index + 1, "rb"]) or
           (df.loc[index + 1, "value"] < df.loc[index + 2, "value"] and df.loc[index, "rb"] == df.loc[index + 2, "rb"]) or
           (df.loc[index + 2, "value"] < df.loc[index + 3, "value"] and df.loc[index, "rb"] == df.loc[index + 3, "rb"])))
    except:
        # Dirty way ;)
        pass

print(df)
将熊猫作为pd导入
数据=[
{“rb”:111,“日期”:“2020年1月1日”,“价值”:5},
{“rb”:111,“日期”:“2020年2月1日”,“价值”:5},
{“rb”:111,“日期”:“2020年3月1日”,“价值”:4},
{“rb”:111,“日期”:“2020年4月1日”,“价值”:6},
{“rb”:111,“日期”:“2020年5月1日”,“价值”:6},
{“rb”:111,“日期”:“2020年6月1日”,“价值”:6},
{“rb”:111,“日期”:“2020年7月1日”,“价值”:6},
{“rb”:111,“日期”:“2020年8月1日”,“价值”:7},
{“rb”:112,“日期”:“2020年1月1日”,“价值”:3},
{“rb”:112,“日期”:“2020年2月1日”,“价值”:3},
{“rb”:112,“日期”:“2020年3月1日”,“价值”:4},
{“rb”:112,“日期”:“2020年4月1日”,“价值”:4},
{“rb”:112,“日期”:“2020年5月1日”,“价值”:5},
{“rb”:112,“日期”:“2020年6月1日”,“价值”:5},
{“rb”:112,“日期”:“2020年7月1日”,“价值”:5},
{“rb”:112,“日期”:“2020年8月1日”,“价值”:5},
{“rb”:111,“日期”:“2020年1月1日”,“价值”:18},
{“rb”:111,“日期”:“2020年2月1日”,“价值”:18},
{“rb”:111,“日期”:“2020年3月1日”,“价值”:17},
{“rb”:111,“日期”:“2020年4月1日”,“价值”:11},
{“rb”:111,“日期”:“2020年5月1日”,“价值”:13},
{“rb”:111,“日期”:“2020年6月1日”,“价值”:13},
{“rb”:111,“日期”:“2020年7月1日”,“价值”:13},
{“rb”:111,“日期”:“2020年8月1日”,“价值”:13},
{“rb”:112,“日期”:“2020年1月1日”,“价值”:14},
{“rb”:112,“日期”:“2020年2月1日”,“价值”:14},
{“rb”:112,“日期”:“2020年3月1日”,“价值”:17},
{“rb”:112,“日期”:“2020年4月1日”,“价值”:17},
{“rb”:112,“日期”:“2020年5月1日”,“价值”:5},
{“rb”:112,“日期”:“2020年6月1日”,“价值”:5},
{“rb”:112,“日期”:“2020年7月1日”,“价值”:5}
]
df=pd.DataFrame(数据)
df[“标志”]=0
对于范围内的索引(len(df)-1):
df.loc[index,“flag”]=int(df.loc[index,“rb”]==df.loc[index+1,“rb”]和
df.loc[index,“value”]

PS:也许先按rb进行分组比较容易,然后检查数据,但这也应该有效。

谢谢你的解决方案,如果对某些caese有效,但在另一种情况下,值减小标志3m保持为0,它应该为1。我没有读到你问题中关于减小的任何内容,只是增大。请具体说明,它应该在什么时候写入1,在什么地方失败,当它减少时,在它增加之前,它会在2个月前或3个月前删除1个字符。尝试用这个值18,18,17,11,13,13,13,13,13,14,14,17,17,5,5编码,然后观察“flag 3m”列的情况,它不会返回三次1,对于flag列中的每一个1。我修复了
之前的两行,除了
,在比较中有一个错误,对于flag中的最后一个值1,只有两个1,而不是三个