检查数据框中是否存在正值

时间:2019-06-01 15:28:09

标签: python pandas numpy

我有数据框:

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

我需要选择所有大于0的值并将它们放在列表中。 如果该行不包含任何正值,则应将0写入列表。

因此,给定数据帧的输出应如下所示:

 [1,2,1,0]

该如何解决?

4 个答案:

答案 0 :(得分:1)

这是您可以使用的简单循环(通过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]

答案 1 :(得分:0)

在您的情况下,首先用您的df stack,然后我们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])

答案 2 :(得分:0)

我们可以在此处广泛使用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]

答案 3 :(得分:0)

您可以应用一个自定义函数,该函数将处理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]