Проверьте, существует ли положительное значение в кадре данных - PullRequest
1 голос
/ 01 июня 2019

У меня есть фрейм данных:

A B C D
1 0 0 2
0 1 0 0
0 0 0 0

Мне нужно выбрать все значения, которые больше 0, и поместить их в список.если строка не содержит положительного значения, в список следует записать 0.

Итак, вывод для данного кадра данных должен выглядеть следующим образом:

 [1,2,1,0]

Как это можно решить?

Ответы [ 4 ]

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

Вот простой цикл, который вы можете использовать (цикл df.values ​​дает нам строки в виде массивов):

output = []

for ar in df.values:
    nonzeros = ar[ar > 0]
    # If nonzeros is not empty proceed and extend the output
    if nonzeros.size:
      output.extend(nonzeros)
    # If not add 0 
    else:
      output.append(0)

print(output)

возвращает:

[1, 2, 1, 0]
0 голосов
/ 01 июня 2019

Вы можете применить пользовательскую функцию, которая будет обрабатывать каждую строку DataFrame и возвращать список.Затем суммировать возвращенные списки.

In [1]: import pandas as pd

In [2]: df = pd.read_clipboard()

In [3]: df
Out[3]: 
   A  B  C  D
0  1  0  0  2
1  0  1  0  0
2  0  0  0  0

In [4]: def get_positive_values(row):
   ...:     # If all elements in a row are zeros
   ...:     # then return a list with a single zero 
   ...:     if row.eq(0).all():
   ...:         return [0]
   ...:     # Else return a list with positive values only.
   ...:     return row[row.gt(0)].tolist()
   ...: 
   ...:     

In [5]: df.apply(get_positive_values, axis=1).sum()
Out[5]: [1, 2, 1, 0]
0 голосов
/ 01 июня 2019

Мы можем широко использовать pandas + numpy здесь:

  1. Маскировать все значения, которые больше 0
m = df.gt(0)

       A      B      C      D
0   True  False  False   True
1  False   True  False  False
2  False  False  False  False
  1. Маска строк, которые не содержат значений выше 0:
s1 = m.any(axis=1).astype(int).values
  1. Получить все значения больше 0 в массиве:
s2 = df.values[m]
  1. Наконец, объедините оба массива друг с другом:
np.concatenate([s2, s1[s1==0]]).tolist()

выход

[1, 2, 1, 0]
0 голосов
/ 01 июня 2019

В вашем случае сначала stack с вашим df, затем мы apply ваше условие, если строка содержит ни одного 0, который мы выбираем, если все 0, то мы сохраняем его как ноль

df.stack().groupby(level=0).apply(lambda x : x.head(1) if all(x==0) else x[x!=0]).tolist()
[1, 2, 1, 0]

или без apply

np.concatenate(df.mask(df==0).stack().groupby(level=0).apply(list).reindex(df.index,fill_value=[0]).values)
array([1., 2., 1., 0.])

Сократить процесс

np.concatenate(list(map(lambda x : [x[0]] if all(x==0) else x[x!=0],df.values)))
array([1, 2, 1, 0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...