gpt4 book ai didi

pandas - 根据 pandas 中另一列的值创建新列

转载 作者:行者123 更新时间:2023-12-02 09:31:55 25 4
gpt4 key购买 nike

我有这个 pandas 数据框,其“代码”列包含顺序分层代码。我的目标是使用每个层次级别代码及其名称创建新列,如下所示:

原始数据:

    Code    Name
0 A USA
1 AM Massachusetts
2 AMB Boston
3 AMS Springfield
4 D Germany
5 DB Brandenburg
6 DBB Berlin
7 DBD Dresden

我的目标:

Code    Name           Level1   Level1Name      Level2  Level2Name      Level3      Level3Name
0 A USA A USA AM Massachusetts AMB Boston
1 AM Massachusetts A USA AM Massachusetts AMB Boston
2 AMB Boston A USA AM Massachusetts AMB Boston
3 AMS Springfield A USA AM Massachusetts AMS Springfiled
4 D Germany D Germany DB Brandenburg DBB Berlin
5 DB Brandenburg D Germany DB Brandenburg DBB Berlin
6 DBB Berlin D Germany DB Brandenburg DBB Berlin
7 DBD Dresden D Germany DB Brandenburg DBD Dresden

我的代码:

import pandas as pd
df = pd.read_excel(r'/Users/BoBoMann/Desktop/Sequence.xlsx')
df['Length']=test.Code.str.len() ## create a column with length of each cell in Code
df['Level1']=test.Code.str[:1] ## create the first level using string indexing
df['Level1Name'] = df[df['Length']==1]['Name']
df.head() ## This yields:



Code Name Length Level1 Level1Name
0 A USA 1 A USA
1 AM Massachusetts 2 A NaN
2 AMB Boston 3 A NaN
3 AMS Springfield 3 A NaN
4 D Germany 1 D Germany
5 DB Brandenburg 2 D NaN
6 DBB Berlin 3 D NaN
7 DBD Dresden 3 D NaN

对于我当前的方法,如何在 Level1Name 列中将这些 NaN 分别转换为 USA 和 德国?

一般来说,是否有更好的方法来实现为每个层次结构层创建列并将它们与另一列中各自的名称相匹配的目标?

最佳答案

IIUC,让我们使用这段代码:

df['Codes'] = [[*i] for i in df['Code']]
df_level = df['Code'].str.extractall('(.)')[0].unstack('match').bfill().cumsum(axis=1)
s_map = df.explode('Codes').drop_duplicates('Code', keep='last').set_index('Code')['Name']
df_level.columns = [f'Level{i+1}' for i in df_level.columns]
df_level_names = pd.concat([df_level[i].map(s_map) for i in df_level.columns],
axis=1,
keys=df_level.columns+'Name')
df_out = df.join([df_level, df_level_names]).drop('Codes', axis=1)
df_out

输出:

  Code           Name Level1 Level2 Level3 Level1Name     Level2Name   Level3Name
0 A USA A AM AMB USA Massachusetts Boston
1 AM Massachusetts A AM AMB USA Massachusetts Boston
2 AMB Boston A AM AMB USA Massachusetts Boston
3 AMS Springfield A AM AMS USA Massachusetts Springfield
4 D Germany D DB DBB Germany Brandenburg Berlin
5 DB Brandenburg D DB DBB Germany Brandenburg Berlin
6 DBB Berlin D DB DBB Germany Brandenburg Berlin
7 DBD Dresden D DB DBD Germany Brandenburg Dresden

解释:

  • 将字符串解压到字符列表中,创建“代码”列
  • 使用 extractall 和正则表达式 . 创建“LevelX”列以获取单个字符,然后沿行 bfill NaN 和 cumsum 到创建“LevelX”列
  • 通过在“Codes”上调用 explode 来创建与 map 一起使用的 pd.Series上面创建的列和 drop_duplicates 保留最后一个值“代码”,然后在“代码”上 set_index 并将“名称”列保留为创建“s_map”。
  • 重命名名称 df_level 列以获取 Level1 而不是 Level0。
  • 使用 pd.concat 和列表理解将 df_level 列映射到使用 s_map 的 df_level_names。另外,使用 keys 参数来重命名新列并附加“名称”
  • 使用 join 将 df 与 df_levels 和 df_level_names 连接,然后删除“Codes”列,创建所需的输出。

关于pandas - 根据 pandas 中另一列的值创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59483651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com