Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何展开多级数据帧_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何展开多级数据帧

Python 如何展开多级数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含三列的熊猫数据框架,前两列是因子,第三列包含计数。我想“分解”或“展开”数据帧,这样就不用为第一列、第二列的每个唯一元素设置一行,而是让行数等于counts列的总和,其中每一新行都有一个唯一且递增的标识符编号,但我想为两列中的一列中的每个级别设置一个单独的计数器。请注意,这个问题与我昨天问的问题类似,但有一些我第一次没有认识到的额外的复杂问题,我无法概括(我自己)如何扩展它 以下是数据帧 data = [['van', 'bc', 1], ['abb', 'bc', 3], ['vi

我有一个包含三列的熊猫数据框架,前两列是因子,第三列包含计数。我想“分解”或“展开”数据帧,这样就不用为第一列、第二列的每个唯一元素设置一行,而是让行数等于counts列的总和,其中每一新行都有一个唯一且递增的标识符编号,但我想为两列中的一列中的每个级别设置一个单独的计数器。请注意,这个问题与我昨天问的问题类似,但有一些我第一次没有认识到的额外的复杂问题,我无法概括(我自己)如何扩展它

以下是数据帧

data = [['van', 'bc', 1], ['abb', 'bc', 3], ['vic','bc',3], ['cal', 'ab', 1], ['edm', 'ab', 2], ['cal','ab', 2], ['van', 'bc', 1]]
df = pd.DataFrame(data, columns = ['city', 'state', 'count']) 
我想把它变成这个


data = [['van', 'bc', 'dr0001'], ['abb', 'bc', 'dr0002'], ['abb', 'bc', 'dr0003'], ['abb', 'bc', 'dr0004'],  ['vic', 'bc', 'dr0005'], ['vic', 'bc', 'dr0006'], ['vic', 'bc', 'dr0007'], ['cal', 'ab', 'dr0001'], ['edm', 'ab', 'dr0002'], ['edm', 'ab', 'dr0003'], ['edm', 'ab', 'dr0004'], ['edm', 'ab', 'dr0005'], ['van', 'bc', 'dr0008']]
df = pd.DataFrame(data, columns = ['city', 'state', 'id'])

谢谢

试试这个,我想你需要一个额外的groupby,在你的输出中加入一些格式:

out = df.loc[df.index.repeat(df["count"])]
out = (
    out.assign(
        id=out.groupby("state")
        .cumcount()
        .add(1)
        .astype(str)
        .str.zfill(4)
        .radd("dr")
    )
    .drop("count", 1)
    .reset_index(drop=True)
)

  • 生成一个
    列表
    然后
    分解()
  • id在状态中递增,因此在DF为正确形状后生成此值
输出 城市 状态 身份证件 0 厢式货车 卑诗省 dr00001 1. 神甫 卑诗省 dr00002 2. 神甫 卑诗省 dr00003 3. 神甫 卑诗省 dr00004 4. 维克 卑诗省 dr00005 5. 维克 卑诗省 dr00006 6. 维克 卑诗省 dr00007 7. 卡尔 ab dr00001 8. 电火花加工 ab dr00002 9 电火花加工 ab dr00003 10 卡尔 ab dr00004 11 卡尔 ab dr00005 12 厢式货车 卑诗省 dr00008
伙计,你们这些家伙又聪明又快。
print(out)

   city state      id
0   van    bc  dr0001
1   abb    bc  dr0002
2   abb    bc  dr0003
3   abb    bc  dr0004
4   vic    bc  dr0005
5   vic    bc  dr0006
6   vic    bc  dr0007
7   cal    ab  dr0001
8   edm    ab  dr0002
9   edm    ab  dr0003
10  cal    ab  dr0004
11  cal    ab  dr0005
12  van    bc  dr0008
data = [['van', 'bc', 1], ['abb', 'bc', 3], ['vic','bc',3], ['cal', 'ab', 1], ['edm', 'ab', 2], ['cal','ab', 2], ['van', 'bc', 1]]
df = pd.DataFrame(data, columns = ['city', 'state', 'count']) 

# first pass, explode
df2 = (df.assign(id=df["count"].apply(lambda n: [f"dr{i+1:05}" for i in range(n)]))
       .explode("id")
       .drop(columns="count").reset_index(drop=True))

# ids increment within state
df2["id"] = df2.groupby("state")["id"].transform(lambda s: [f"dr{i+1:05}" for i,v in enumerate(s)])