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 - 用于与多个 boolean 列/系列进行类似集合比较的矢量化 Pandas 方法

python - 当有很多选择时如何提高我的 pandas 效率

pandas - Dataframe 过滤每天的最高值并将其再次保存在具有 2 列的 DataFrame 中

python - Pandas:如何删除重复行,但保留所有行的最大值

pandas - 用 Pandas 进行数据分析

python - 如何在 Python 中进行导入

python - 如何获取 facebook-sdk 的 oauth_access_token

python - Jinja 的循环变量在 include-d 模板中不可用

python - 加快 Pandas 数据框中字符串的整数编码

python - 格式化 Pandas 数据框索引日期