python-3.x 在Pandas中分解多个不均匀行

xqkwcwgp  于 2023-02-26  发布在  Python
关注(0)|答案(2)|浏览(157)

我有两列,电话和电子邮件,需要将它们分解为行。我已经知道如何对其中一列进行分解,但不能同时对这两列进行分解。最大的问题是,我可能有0到许多电话和0到许多电子邮件。因此,如果客户有三封电子邮件,但没有电话,那么我需要3行。如果他们有四部电话和三封电子邮件,那么我需要4行。每个电话一行。以及这四行中的三封电子邮件。示例数据:

| many columns | phones | emails |
|:-------------|:------:|:-------|
| row 1        | A,B,C  | A,B    |
| row 2        |        | D,E,F  |

示例结果:
x一个一个一个一个x一个一个二个x
当我尝试上面的代码时,我得到了错误:ValueError: cannot reindex on an axis with duplicate labels

q9rjltbz

q9rjltbz1#

我假设原始 Dataframe 上的索引是唯一的,如果不是,在下面的代码段之前运行df = df.reset_index()

columns = ["phones", "emails"]

# Explode each column individually, but instead of using `explode`, we will
# use`stack` to give us a second index level
exploded = [
    df[col].str.split(",", expand=True).stack().rename(col)
    for col in columns
]

# Align the exploded columns
exploded = pd.concat(exploded, axis=1).droplevel(-1)

# Merge it with the original data frame
result = pd.concat([df.drop(columns=columns), exploded], axis=1)
dddzy1tm

dddzy1tm2#

我在哪里读到的。如果我找到链接,我会上传的。

import itertools
import pandas as pd
import numpy as np
from pandas import DataFrame as df


df = pd.DataFrame({"x":[1,3,7],"y":["A","B","C"], 
                   "z":["p1,p2,p3","p4","p5,p6"],"package_code":["111,222,333","444","555,666"]})

print(df)
"""
   x  y         z package_code
0  1  A  p1,p2,p3  111,222,333
1  3  B        p4          444
2  7  C     p5,p6      555,666

"""
aa = (
    df.set_index(['x','y'])
    .apply(lambda col : pd.Series(col).str.split(','))
    .explode(['z','package_code'])
    .reset_index()
    .reindex(df.columns,axis=1)
    )
print(aa)

"""
   x  y   z package_code
0  1  A  p1          111
1  1  A  p2          222
2  1  A  p3          333
3  3  B  p4          444
4  7  C  p5          555
5  7  C  p6          666
"""

相关问题