我想在现有数据帧中创建一个新列,其中每行中的值都以相邻列中的某个规则为条件。我举个例子。 我有以下字典:
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 的更多信息,我的解决方案可能有点笨拙,但我相信很快就会有人来改进它。