根据条件转换数据帧的列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据条件转换数据帧的列相关的知识,希望对你有一定的参考价值。

当rap等于1时,我愿意添加一个连续三个1的新列。连续三个1必须在同一年,当说唱等于一,而前两个是从那一个。新列必须是id(我有一个数据面板)。

df看起来像这样:

id  year  rap  cohort  jobs  year_of_life  
1  2009    0     NaN      10      NaN       
1  2012    0     2012     12      0         
1  2013    0     2012     12      1         
1  2014    0     2012     13      2         
1  2015    1     2012     15      3         
1  2016    0     2012     17      4       
1  2017    0     2012     18      5         
2  2009    0     2009     15      0         
2  2010    0     2009     2       1         
2  2011    0     2009     3       2         
2  2012    1     2009     3       3         
2  2013    0     2009     15      4         
2  2014    0     2009     12      5         
2  2015    0     2009     13      6         
2  2016    0     2009     13      7         

预期产量:

id  year  rap  cohort  jobs  year_of_life  rap_new
1  2009    0     NaN      10      NaN       0  
1  2012    0     2012     12      0         0   
1  2013    0     2012     12      1         1
1  2014    0     2012     13      2         1
1  2015    1     2012     15      3         1
1  2016    0     2012     17      4         0
1  2017    0     2012     18      5         0
2  2009    0     2009     15      0         0
2  2010    0     2009     2       1         1
2  2011    0     2009     3       2         1
2  2012    1     2009     3       3         1
2  2013    0     2009     15      4         0
2  2014    0     2009     12      5         0
2  2015    0     2009     13      6         0
2  2016    0     2009     13      7         0
答案

这是一种方式。

# calculate rap_new indices
rap_indices = [i for i, j in enumerate(df.rap) if j==1]
rap_new_indices = list(set.union(*[set(range(n-2, n+1)) for n in rap_indices]))

# apply indices to new col
df.rap_new = 0
df.loc[rap_new_indices, 'rap_new'] = 1

#     id  year  rap  cohort  jobs  year_of_life  rap_new
# 0    1  2009    0     NaN    10           NaN        0
# 1    1  2012    0  2012.0    12           0.0        0
# 2    1  2013    0  2012.0    12           1.0        1
# 3    1  2014    0  2012.0    13           2.0        1
# 4    1  2015    1  2012.0    15           3.0        1
# 5    1  2016    0  2012.0    17           4.0        0
# 6    1  2017    0  2012.0    18           5.0        0
# 7    2  2009    0  2009.0    15           0.0        0
# 8    2  2010    0  2009.0     2           1.0        1
# 9    2  2011    0  2009.0     3           2.0        1
# 10   2  2012    1  2009.0     3           3.0        1
# 11   2  2013    0  2009.0    15           4.0        0
# 12   2  2014    0  2009.0    12           5.0        0
# 13   2  2015    0  2009.0    13           6.0        0
# 14   2  2016    0  2009.0    13           7.0        0
另一答案

选项1 使用pd.Series.shift变得棘手

df.assign(
    rap_new=sum(df.rap.shift(-i).fillna(0, downcast='infer') for i in range(3)))

    id  year  rap  cohort  jobs  year_of_life  rap_new
0    1  2009    0     NaN    10           NaN        0
1    1  2012    0  2012.0    12           0.0        0
2    1  2013    0  2012.0    12           1.0        1
3    1  2014    0  2012.0    13           2.0        1
4    1  2015    1  2012.0    15           3.0        1
5    1  2016    0  2012.0    17           4.0        0
6    1  2017    0  2012.0    18           5.0        0
7    2  2009    0  2009.0    15           0.0        0
8    2  2010    0  2009.0     2           1.0        1
9    2  2011    0  2009.0     3           2.0        1
10   2  2012    1  2009.0     3           3.0        1
11   2  2013    0  2009.0    15           4.0        0
12   2  2014    0  2009.0    12           5.0        0
13   2  2015    0  2009.0    13           6.0        0
14   2  2016    0  2009.0    13           7.0        0

选项2 实验 不要用这个!我只是玩得开心。

from numpy.lib.stride_tricks import as_strided as strides

a = df.rap.values
s = a.strides[0]

df.assign(rap_new=strides(np.append(a, [0, 0]), (a.shape[0], 3), (s, s)).sum(1))

    id  year  rap  cohort  jobs  year_of_life  rap_new
0    1  2009    0     NaN    10           NaN        0
1    1  2012    0  2012.0    12           0.0        0
2    1  2013    0  2012.0    12           1.0        1
3    1  2014    0  2012.0    13           2.0        1
4    1  2015    1  2012.0    15           3.0        1
5    1  2016    0  2012.0    17           4.0        0
6    1  2017    0  2012.0    18           5.0        0
7    2  2009    0  2009.0    15           0.0        0
8    2  2010    0  2009.0     2           1.0        1
9    2  2011    0  2009.0     3           2.0        1
10   2  2012    1  2009.0     3           3.0        1
11   2  2013    0  2009.0    15           4.0        0
12   2  2014    0  2009.0    12           5.0        0
13   2  2015    0  2009.0    13           6.0        0
14   2  2016    0  2009.0    13           7.0        0

以上是关于根据条件转换数据帧的列的主要内容,如果未能解决你的问题,请参考以下文章

在R中将具有不同长度和两个条件的不同数据帧的列相乘

对于要求,我需要通过从该数据帧的列中的列表中的值创建行来将数据帧转换为 [重复]

(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值

根据原始数据帧的两列之间的条件创建新的数据帧[关闭]

在 R 中,如何使用各种条件将数字列变为一个新列?

Pandas:根据条件为多索引数据帧的子集设置值的正确方法