我有一个来自 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/