python - Pandas groupby 转置

标签 python pandas pandas-groupby

我有一个来自 SAP 的文件,在处理数据时它不是最漂亮的文件。因此,使用 series.str.contains() 和 bool 掩码,我设法缩小到如下所示的数据框:

       0        1
0    SUB      123
1    CAT      SKU
2   CODE  1000123
3   CODE  1000234
4    SUB      456
5    CAT      LIQ
6  CODE1  1000345
7  CODE1  1000534
8  CODE1  1000433

我正在寻找一种方法,可以将每个 SUB 分成一个新条目,如下所示:

print(expected_df)

   SUB  CAT       CODE      CODE1
0  123  SKU  1000123.0        NaN
1  123  SKU  1000234.0        NaN
2  456  LIQ        NaN  1000345.0
3  456  LIQ        NaN  1000534.0
4  456  LIQ        NaN  1000433.0

我似乎无法通过这一步。然而,这一行:

df[0].eq('SUB').cumsum()

有助于隔离组,如果需要可以用作辅助系列。

如果您能帮助我们转换所示的数据,我们将不胜感激。

谢谢。

最佳答案

对于特定的“SUB”列组行,您可以尝试使用 df.pivot,然后使用 .ffill(),bfill()。

df1 = df.pivot(columns='0')
df1.columns = df1.columns.map(lambda x: x[1])
df1.SUB = df1.SUB.ffill()
df1.groupby('SUB').ffill().groupby('SUB').bfill().drop_duplicates()
#5.89 ms ± 1.84 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

# as time constraints, without use of lambda operation
#df1.groupby(df1.SUB.ffill()).apply(lambda x: x.ffill().bfill()).drop_duplicates()
#16 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

输出:

    SUB CAT CODE    CODE1   SUB
2   123 SKU 1000123 NaN     123
3   123 SKU 1000234 NaN      123
6   456 LIQ NaN     1000345 456
7   456 LIQ NaN     1000534 456
8   456 LIQ NaN     1000433 456

关于python - Pandas groupby 转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55325191/

相关文章:

python - 如何使用 pandas 和 Python 根据类标签分离数据

python - 如何旋转数据框

python - Groupby 并使用自定义函数执行逐行计算

python - 处理 nan 值的 groupby 对象上的 pandas transform nunique

python - 检查一个数据帧中的值是否存在于另一个数据帧中,打印所有值对

python - 如何在函数中包含一个并不总是需要的输入参数(在 python 中)?

python - 使用 *not* 在 pandas groupby 中进行分组的标签

python - 求一个月内n个最大的平均值,但日期必须是唯一的(Pandas)

python - 带有正则表达式的 Unicode 正则表达式在 Python 中不起作用

Python:强制虚拟环境使用 Windows 上的系统证书存储