Как мне создать столбец, значения которого будут равны числу 1 в этой строке, которые впервые появляются в отдельном столбце? - PullRequest
1 голос
/ 30 мая 2020

Как выполнить эту операцию, используя pandas?

Начальный Df:

    A B C D
0   0 1 0 0
1   0 1 0 0
2   0 0 1 1
3   0 1 0 1
4   1 1 0 0
5   1 1 1 0

Конечный Df:

    A B C D Param
0   0 1 0 0     1
1   0 1 0 0     0
2   0 0 1 1     2
3   0 1 0 1     0
4   1 1 0 0     1
5   1 1 1 0     0

Обычно Param - это количество 1 в той строке, которая впервые появляется в собственном столбце. Пример: индекс 0: 1 в столбце B появляется впервые, поэтому Param1 = 1

index 1: ни один из 1 не появляется впервые в своем собственном столбце, следовательно, Param1 = 0

индекс 2: 1 в столбце C и D появляется впервые в своих столбцах, следовательно, Paramm1 = 2

index 3: ни один из 1 не появляется впервые сам по себе столбец, следовательно, Param1 = 0

индекс 4: 1 в столбце A появляется впервые в столбце, следовательно, Paramm1 = 1

index 5: ни один из 1 не появляется для первого время в собственном столбце, следовательно, Param1 = 0

Ответы [ 3 ]

1 голос
/ 30 мая 2020

сделаю idxmax и value_counts

df['Param']=df.idxmax().value_counts().reindex(df.index,fill_value=0)
df
   A  B  C  D  Param
0  0  1  0  0      1
1  0  1  0  0      0
2  0  0  1  1      2
3  0  1  0  1      0
4  1  1  0  0      1
5  1  1  1  0      0
1 голос
/ 30 мая 2020

IIU C, вы можете проверить повторяющиеся значения, умножить на df и получить сумму:

df['Param'] = df.apply(lambda x: ~x.duplicated()).mul(df).sum(1)

Вывод:

   A  B  C  D  Param
0  0  1  0  0      1
1  0  1  0  0      0
2  0  0  1  1      2
3  0  1  0  1      0
4  1  1  0  0      1
5  1  1  1  0      0
0 голосов
/ 30 мая 2020

Предполагая, что это целые числа, вы можете дважды использовать cumsum (), чтобы изолировать первое вхождение 1.

df2 = (df.cumsum() > 0).cumsum() == 1
df['Param'] = df2.sum(axis = 1)
print(df)

Если элементы df являются строками, вы должны сначала преобразовать их в целые числа.

df = df.astype(int)
...