保留 DataFrame 中列的第一个元素

时间:2021-07-05 08:48:15

标签: python pandas

我有一个这样的 DataFrame。

>>> df = pd.DataFrame([[3., 0, 0], [0, 3., 0], [0, 0, 0], [0, 6., 6.], [1., 0, 0], [2., 5., 0]]).T
>>> df
     0    1    2    3    4    5
0  3.0  0.0  0.0  0.0  1.0  2.0
1  0.0  3.0  0.0  6.0  0.0  5.0
2  0.0  0.0  0.0  6.0  0.0  0.0

我想要做的是逐列保留第一个元素,用零替换其他非零值。

>>> expected
     0    1    2    3    4    5
0  3.0  0.0  0.0  0.0  1.0  2.0
1  0.0  3.0  0.0  6.0  0.0  0.0
2  0.0  0.0  0.0  0.0  0.0  0.0

我的目标是获得一系列第一个元素,我想通过 sum() 来实现,所以我需要列中其他元素的零值。

>>> expected.sum()
0    3.0
1    3.0
2    0.0
3    6.0
4    1.0
5    2.0
dtype: float64

非常感谢您。

3 个答案:

答案 0 :(得分:4)

屏蔽零然后 bfill 并使用 iloc

选择第一行
df[df != 0].bfill().iloc[0].fillna(0)

0    3.0
1    3.0
2    0.0
3    6.0
4    1.0
5    2.0
Name: 0, dtype: float64

答案 1 :(得分:2)

另一种首先使用带有 mask 的布尔值创建目标数据框,然后求和并指定轴的方法。

df_new = df.mask(~df.ne(0).cumsum(0).cumsum(0).eq(1)).fillna(0)

     0    1    2    3    4    5
0  3.0  0.0  0.0  0.0  0.0  2.0
1  0.0  3.0  0.0  6.0  0.0  0.0
2  0.0  0.0  0.0  0.0  0.0  0.0

然后

df_new.sum(0)

0    3.0
1    3.0
2    0.0
3    6.0
4    0.0
5    2.0
dtype: float64

答案 2 :(得分:0)

你可以这样做:

import pandas as pd

# initialize table
df = pd.DataFrame([[3., 0, 0], [0, 3., 0], [0, 0, 0], [0, 6., 6.], [1., 0, 0], [2., 5., 0]]).T

# detect first non-zero value
# see https://stackoverflow.com/questions/50586146/find-first-non-zero-value-in-each-column-of-pandas-dataframe for details
non_zero_indexes = list(df.ne(0).idxmax()) # [0, 1, 0, 1, 0, 0]

for col_id in df.columns:
  if non_zero_indexes[col_id] != 0 and len(df) > 1:
    col_start = list(df[col_id][:non_zero_indexes[col_id]+1]) # e.g. [0.0, 6.0]
    col_end   = [0.0] * (len(df) - len(col_start)) # [0.0], i.e. fill with zeros
    df[col_id] = col_start + col_end # merge and get [0.0, 6.0, 0.0]

这样,您将获得以下输出:

>>> df
     0    1    2    3    4    5
0  3.0  0.0  0.0  0.0  1.0  2.0
1  0.0  3.0  0.0  6.0  0.0  0.0
2  0.0  0.0  0.0  0.0  0.0  0.0