根据现有列中的某些规则在新数据帧列中设置值



我想在现有数据帧中创建一个新列,其中每行中的值都以相邻列中的某个规则为条件。我举个例子。 我有以下字典:

d1={"commence_time":["12/6/2019 14:00", "12/7/2019 17:30", 
"12/7/2019 17:30","12/8/2019 19:30",
"12/9/2019 19:30","12/28/2019 15:00",
"12/28/2019 15:00","12/28/2019 15:00"],
"value1":["5","5","5","5","5","5","5","5"]}

我创建了以下数据帧:

df1=pd.DataFrame(data=d1)

这导致:

commence_time     value1
0  12/6/2019 14:00     5
1  12/7/2019 17:30     5
2  12/7/2019 17:30     5
3  12/8/2019 19:30     5
4  12/9/2019 19:30     5
5  12/28/2019 15:00    5
6  12/28/2019 15:00    5
7  12/28/2019 15:00    5

我想创建另一列名为 value2,其中应用以下规则:如果下一行的开始时间后跟不同的开始时间,则第一行中的 value2 应等于 value1。如果开始时间与下一行(甚至可能与下一行(完全相同,则 value2 中的数字为 value1 与 5 之和。预期结果为:

commence_time   value1  value2
0  12/6/2019 14:00    5      5
1  12/7/2019 17:30    5     10
2  12/7/2019 17:30    5     10
3  12/8/2019 19:30    5      5
4  12/9/2019 19:30    5      5
5  12/28/2019 15:00   5     10
6  12/28/2019 15:00   5     10
7  12/28/2019 15:00   5     10

真的不知道如何处理这个问题,所以我没有真正尝试任何事情。建议赞赏。

如果数据帧显示如上排序,则这与其说是连续检查,不如说只是duplicated检查。使用掩码仅向所需的行添加 5。

magic_num = 5
df1['value2'] = df1.value1.astype(int) + df1.commence_time.duplicated(keep=False)*magic_num

但是,如果确实需要连续的行检查,而不是数据帧中的任何位置,则可以执行此检查移位值并查找大于 1 的组以将值添加到其中。

s = df1.commence_time.ne(df1.commence_time.shift()).cumsum()
df1['value2'] = df1.value1.astype(int) + (s.groupby(s).transform('size') > 1)*magic_num

commence_time value1  value2
0   12/6/2019 14:00      5       5
1   12/7/2019 17:30      5      10
2   12/7/2019 17:30      5      10
3   12/8/2019 19:30      5       5
4   12/9/2019 19:30      5       5
5  12/28/2019 15:00      5      10
6  12/28/2019 15:00      5      10
7  12/28/2019 15:00      5      10
import numpy
d1={"commence_time":["12/6/2019 14:00", "12/7/2019 17:30", 
"12/7/2019 17:30","12/8/2019 19:30",
"12/9/2019 19:30","12/28/2019 15:00",
"12/28/2019 15:00","12/28/2019 15:00"],
"value1":[5,5,5,5,5,5,5,5]}

df1=pd.DataFrame(data=d1)
df1['timeshift']= df1.commence_time.shift(-1)
df1['valueshift']= df1.value1.shift(-1)
df1['value2'] = np.where(df1.commence_time == df1.timeshift,
df1.value1 + df1.valueshift,df1.value1)

嗨,试试看,您可以查看 numpy 文档以获取有关 np.where 的更多信息,我的解决方案可能有点笨拙,但我相信很快就会有人来改进它。