根据其在组中的出现情况,将数字添加到分组值中

2024-04-29 08:02:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用相同的ID向相同的文件室引用添加一个数字。因此,我的数据框有两列(“ID”和“文件室”)。我想根据单个ID在“房间”列中的出现情况为每个房间添加一个数字。下面是原始df和所需df

示例:ID34有3间卧室,所以我希望第一间是->;卧室1,第二层->;卧室2和第三间->;卧室3

原始df:

ID     Room
34     Livingroom
34     Bedroom
34     Kitchen
34     Bedroom
34     Bedroom
34     Storage
50     Kitchen
50     Kitchen
89     Livingroom
89     Bedroom
89     Bedroom
98     Livingroom

所需df:

ID     Room
34     Livingroom_1
34     Bedroom_1
34     Kitchen_1
34     Bedroom_2
34     Bedroom_3
34     Storage_1
50     Kitchen_1
50     Kitchen_2
89     Livingroom_1
89     Bedroom_1
89     Bedroom_2
98     Livingroom_1

试用代码:

import pandas as pd

import numpy as np



data = pd.DataFrame({"ID": [34,34,34,34,34,34,50,50,89,89,89,98],
                     
                   "Room": ['Livingroom','Bedroom','Kitchen','Bedroom','Bedroom','Storage','Kitchen','Kitchen','Livingroom','Bedroom','Bedroom','Livingroom']})

df = pd.DataFrame(columns=['ID'])
for i in range(df['Room'].nunique()):
    df_new = (df[df['Room'] == ])

    df_new.columns = ['ID', 'Room' + str(i)]
      
    df_result = df_result.merge(df_new, on='ID', how='outer')






Tags: 文件importgtiddfnew数字storage
3条回答
import inflect
p = inflect.engine()

df['Room'] += df.groupby('Room').cumcount().add(1).map(p.ordinal).radd('_')
print(df)

https://stackoverflow.com/a/59951701/3756587我是从这里抄来的

让我们尝试将房间和按房间和ID分组的df的cumcount连接起来,如下所示

df=df.assign(Room=df.Room+"_"+(df.groupby(['ID','Room']).cumcount()+1).astype(str))



ID          Room
0   34  Livingroom_1
1   34     Bedroom_1
2   34     Kitchen_1
3   34     Bedroom_2
4   34     Bedroom_3
5   34     Storage_1
6   50     Kitchen_1
7   50     Kitchen_2
8   89  Livingroom_1
9   89     Bedroom_1
10  89     Bedroom_2
11  98  Livingroom_1

这里有一些代码可以为您做到这一点。我基本上把它分为三个步骤

  1. 执行groupby应用以获取对groupby操作应用自定义函数。这允许您为每对ID生成新名称,房间
  2. 将多重索引减少为原始索引。因为我们在两列上分组,所以索引现在是两列的分层分组。我们放弃了原来的名字,因为我们想用我们的新名字
  3. 对每个条目执行分解。这是因为为了简单起见,我们将应用结果计算为一个数组。随后的分解为数组中的每个元素指定一个唯一的行
def f(rooms_col):
    arr = np.empty(len(rooms_col), dtype=object)
    for i, name in enumerate(rooms_col):
        arr[i] = name + f"_{i + 1}"
    return arr

# assuming data is the data from above
tmp_df = data.groupby(["ID", "Room"])["Room"].apply(f)
# Drop the old room name
tmp_df.index = tmp_df.index.droplevel(1)
# Explode the results array -> 1 row per entry
df = tmp_df.explode()
print(df)

以下是您的输出:

ID
34       Bedroom_1
34       Bedroom_2
34       Bedroom_3
34       Kitchen_1
34    Livingroom_1
34       Storage_1
50       Kitchen_1
50       Kitchen_2
89       Bedroom_1
89       Bedroom_2
89    Livingroom_1
98    Livingroom_1
Name: Room, dtype: object

相关问题 更多 >