从每一列中删除零并使用Python Pandas/Numpy重新排列

2w2cym1i  于 2023-08-01  发布在  Python
关注(0)|答案(3)|浏览(78)

我完全是Python的新手,目前我遇到了一个简单但棘手的情况。有没有可能去掉所有这些零,然后重新排列列:

A B C D E F
10 10 5 0 0 0
0 0 0 13 3 4
0 13 41 55 0 0
0 0 31 30 21 0
11 19 20 0 0 0

字符串
变成这样:

A B C 
10 10 5
13 3 4
13 41 55
31 30 21
11 19 20

t9aqgxwy

t9aqgxwy1#

假设所有行都有相同数量的零:

a = df.to_numpy()
a = a[a!=0].reshape(-1,3)

个字符

luaexgnf

luaexgnf2#

你可以在列中使用apply numpy的trim_zeros
注意,这里的假设是,你的零是每行的头或尾

cleaned = np.apply_along_axis(np.trim_zeros, 1, df.to_numpy())
pd.DataFrame(cleaned, columns=df.columns[: cleaned.shape[-1]])

    A   B   C
0   10  10  5
1   13  3   4
2   13  41  55
3   31  30  21
4   11  19  20

字符串

y0u0uwnf

y0u0uwnf3#

我们可以使用stackcumcount来重新创建列。
首先,让我们使用mask将任何0转换为NaN值,默认情况下,这些值会被删除在stack中:

from string import ascii_uppercase #for your columns.

letters = dict(enumerate(list(ascii_uppercase)))
s  = df.mask(df.eq(0)).stack().reset_index(1,drop=True).to_frame()

df1 = (
    s.set_index(s.groupby(level=0).cumcount().map(letters), append=True)
    .unstack(1)
    .droplevel(0, 1)
)

print(df1)

   A   B   C
0  10  10   5
1  13   3   4
2  13  41  55
3  31  30  21
4  11  19  20

字符串

相关问题