Python: 如何用零填充?
Python: How to pad with zeros?
假设我们有如下数据框:
df = pd.DataFrame({ 'Col1' : ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c'],
'col2' : ['0.5', '0.78', '0.78', '0.4', '2', '9', '2', '7',]
})
我计算了 col1
中所有唯一值的行数。就像 a
有 4 行,b
和 c
各有 2 行,方法是:
df.groupby(['Col1']).size()
我得到的输出是
Col1
a 4
b 2
c 2
dtype: int64
完成后,我想检查a,b,c中哪个具有最大行数(在这种情况下,a
具有最大行数)并填充其他(b
和 c
) 与最大值和它们所拥有的行之间的差异,带有零(b
和 c
各有 2 行,因为 4 是最大值行数,我想用 2 个零填充 b
和 c
)。必须在末尾添加零。
我想用零填充它,因为我想在所有变量 (a、b、c) 上应用固定大小的 window 来绘制图形。
您可以通过GroupBy.cumcount
, create MultiIndex
and DataFrame.reindex
by all combinations created by MultiIndex.from_product
创建计数器:
df1 = df.set_index(['Col1', df.groupby('Col1').cumcount()])
mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)
df2 = df1.reindex(mux, fill_value=0).reset_index(level=1, drop=True).reset_index()
print (df2)
Col1 col2
0 a 0.5
1 a 0.78
2 a 0.78
3 a 0.4
4 b 2
5 b 9
6 b 0
7 b 0
8 c 2
9 c 7
10 c 0
11 c 0
与使用 cumcount
的 Jez 相同的逻辑,但使用 stack
和 unstack
链
df.assign(key2=df.groupby('Col1').cumcount()).set_index(['Col1','key2']).unstack(fill_value=0).stack().reset_index('Col1')
Out[1047]:
Col1 col2
key2
0 a 0.5
1 a 0.78
2 a 0.78
3 a 0.4
0 b 2
1 b 9
2 b 0
3 b 0
0 c 2
1 c 7
2 c 0
3 c 0
假设我们有如下数据框:
df = pd.DataFrame({ 'Col1' : ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'c'],
'col2' : ['0.5', '0.78', '0.78', '0.4', '2', '9', '2', '7',]
})
我计算了 col1
中所有唯一值的行数。就像 a
有 4 行,b
和 c
各有 2 行,方法是:
df.groupby(['Col1']).size()
我得到的输出是
Col1
a 4
b 2
c 2
dtype: int64
完成后,我想检查a,b,c中哪个具有最大行数(在这种情况下,a
具有最大行数)并填充其他(b
和 c
) 与最大值和它们所拥有的行之间的差异,带有零(b
和 c
各有 2 行,因为 4 是最大值行数,我想用 2 个零填充 b
和 c
)。必须在末尾添加零。
我想用零填充它,因为我想在所有变量 (a、b、c) 上应用固定大小的 window 来绘制图形。
您可以通过GroupBy.cumcount
, create MultiIndex
and DataFrame.reindex
by all combinations created by MultiIndex.from_product
创建计数器:
df1 = df.set_index(['Col1', df.groupby('Col1').cumcount()])
mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)
df2 = df1.reindex(mux, fill_value=0).reset_index(level=1, drop=True).reset_index()
print (df2)
Col1 col2
0 a 0.5
1 a 0.78
2 a 0.78
3 a 0.4
4 b 2
5 b 9
6 b 0
7 b 0
8 c 2
9 c 7
10 c 0
11 c 0
与使用 cumcount
的 Jez 相同的逻辑,但使用 stack
和 unstack
链
df.assign(key2=df.groupby('Col1').cumcount()).set_index(['Col1','key2']).unstack(fill_value=0).stack().reset_index('Col1')
Out[1047]:
Col1 col2
key2
0 a 0.5
1 a 0.78
2 a 0.78
3 a 0.4
0 b 2
1 b 9
2 b 0
3 b 0
0 c 2
1 c 7
2 c 0
3 c 0