我有一个这样的 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
非常感谢您。
答案 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