通过添加具有条件的两个相邻行来创建列

Posted

技术标签:

【中文标题】通过添加具有条件的两个相邻行来创建列【英文标题】:Creating a column by addition of two adjacent rows with a condition 【发布时间】:2019-11-09 02:11:20 【问题描述】:

创建填充列 C 的 E 列。如果 D 小于 10,则填充先前行和当前行的 C。

这是我的输入数据集:

I,A,B,C,D
1,P,100+,L,15
2,P,100+,M,9
3,P,100+,N,15
4,P,100+,O,15
5,Q,100+,L,2
6,Q,100+,M,15
7,Q,100+,N,3
8,Q,100+,O,15

我尝试使用一些 for 循环。但是,我认为我们可以使用 shift 或 append 函数来完成此操作。但是,我使用 shift 函数得到值错误。

期望的输出:

I,A,B,C,D,E
1,P,100+,L,15,L
2,P,100+,M,9,M+N
3,P,100+,N,15,M+N
4,P,100+,O,15,O
5,Q,100+,L,2,L+O
6,Q,100+,M,15,M+N
7,Q,100+,N,3,M+N
8,Q,100+,O,15,L+O

我正在计算上面所需输出表中给出的列 E。

【问题讨论】:

输出是否正确?最后 4 个值? 是的。在这里,我们尝试将 L 与 O 以及 M 与 N 合并。 但是什么是逻辑?你能解释更多吗?因为 5 和 8 行不是下一个/上一个。 我很抱歉。如果 D,L/M/N/O 属于不同的类别。有顺序给出。但是,我需要将 L 与 O 合并。在这种情况下,我已经按照所需的合并顺序对数据进行了排序并解决了问题。 【参考方案1】:

使用np.wherepd.shift

##will populate C values index+1 where the condition is True 
df['E'] = np.where( df['D'] < 10,df.loc[df.index + 1,'C'] , df['C'])
##Appending the values of C and E
df['E'] = df.apply(lambda x: x.C + '+' + x.E if x.C != x.E else x.C, axis=1)
df['F'] = df['E'].shift(1)
##Copying the values at index+1 position where the condition is True
df['E'] = df.apply(lambda x: x.F if '+' in str(x.F) else x.E, axis=1)

df.drop('F', axis=1, inplace=True)

输出

   I  A     B  C   D    E
0  1  P  100+  L  15    L
1  2  P  100+  M   9  M+N
2  3  P  100+  N  15  M+N
3  4  P  100+  O  15    O
4  5  Q  100+  L   2  L+M
5  6  Q  100+  M  15  L+M
6  7  Q  100+  N   3  N+O
7  8  Q  100+  O  15  N+O

【讨论】:

【参考方案2】:

想法是通过用Series.where 替换掩码的索引值并仅向前填充一个缺失值来创建帮助组,然后用numpy.whereGroupBy.transformjoin 设置新列:

m = df['D'].lt(10)
g = df.index.to_series().where(m).ffill(limit=1)
df['E'] = np.where(g.notna(), df['C'].groupby(g.fillna(-1)).transform('+'.join), df['C'])
print (df)
   I  A     B  C   D    E
0  1  P  100+  L  15    L
1  2  P  100+  M   9  M+N
2  3  P  100+  N  15  M+N
3  4  P  100+  O  15    O
4  5  Q  100+  L   2  L+M
5  6  Q  100+  M  15  L+M
6  7  Q  100+  N   3  N+O
7  8  Q  100+  O  15  N+O

【讨论】:

以上是关于通过添加具有条件的两个相邻行来创建列的主要内容,如果未能解决你的问题,请参考以下文章

根据两个不同的条件拆分一列字符串(具有不同的模式)

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

SQL Server 2014 - 选择具有两个条件的语句

一组数据里面怎样查找相邻和相同的整数算法设计解决方案

SqlSever基础 在指定的数据库中添加一个表(具有两个列)

7-09内连接查询