【问题标题】:Set value in a new dataframe column based on some rule in existing column根据现有列中的某些规则在新数据框列中设置值
【发布时间】:2020-04-28 13:19:36
【问题描述】:

我想在现有数据框中创建一个新列,其中每行中的值取决于相邻列中的某些规则。让我举个例子。 我有以下字典:

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"]}

我创建了以下 DataFrame:

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

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

【问题讨论】:

  • 我想我有点困惑这些值是否总是相同,或者如果最后一组是 5、6、6 会发生什么。输出应该是 11,12,12 还是 11,11,12,或者不同的东西
  • 事实上,如果最后一组值是 5,6,6,那么将 5 相加将得到 10,11,11。 “value1”中的值并不总是相同的来回答问题。为了简单和可读性,我输入了相同的值,但我意识到这可能会给可能的解决方案带来混乱。
  • 数据框的最后一行应该发生什么?
  • 如果开始时间与前一行不同,则从“value1”列复制值。如果不是(即开始时间与上一行相同),则值 2 与 5 相加。
  • 是的,这些行加起来 5。是的,这个数字与 value1 无关

标签: python pandas if-statement conditional-statements


【解决方案1】:

如果您的 DataFrame 显示为如上排序,那么这不是连续检查,因为它可能只是 duplicated 检查。使用掩码将 5 添加到您想要的行。

magic_num = 5

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

但是,如果确实需要进行连续的行检查,而不是在 DataFrame 中的任何位置,您可以执行此检查移位值并查找大于 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

【讨论】:

    【解决方案2】:
    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 的更多信息,我的解决方案可能有点老套,但我相信很快就会有人改进它。

    【讨论】:

    • 我将你的 r "value1":["5","5","5","5","5","5","5","5"] 转换为我假设你只是用这个作为例子的整数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多