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