我有数据框:
A B C D
1 0 0 2
0 1 0 0
0 0 0 0
我需要选择所有大于0的值并将它们放在列表中。 如果该行不包含任何正值,则应将0写入列表。
因此,给定数据帧的输出应如下所示:
[1,2,1,0]
该如何解决?
答案 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
0
的值m = df.gt(0)
A B C D
0 True False False True
1 False True False False
2 False False False False
s1 = m.any(axis=1).astype(int).values
0
的值:s2 = df.values[m]
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]