Создание столбца путем добавления двух соседних строк с условием - PullRequest
1 голос
/ 27 июня 2019

Создать столбец E, который заполняет столбец C. Если D <10, то он заполняет C предыдущей строки и текущей строки. </p>

Это мой входной набор данных:

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

Iпопытался использовать некоторые для петель.Тем не менее, я думаю, что мы можем использовать функции сдвига или добавления, чтобы завершить это.Тем не менее, я получаю значения ошибок, используя функцию сдвига.

Желаемый результат:

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, приведенным в таблице желаемых выходных данных выше.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

с использованием np.where и pd.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
1 голос
/ 27 июня 2019

Идея состоит в том, чтобы создать вспомогательные группы, заменив значения индекса маской на Series.where и заполнив только одно пропущенное значение, затем установите новый столбец на numpy.where на GroupBy.transform и join:

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
...