根据熊猫中另一列的值创建新列

BoBoMann

我有带有列“ Code”的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分别转换为美国和德国?

通常,是否有更好的方法来达到我为每个层次结构层创建列并使它们与另一列中各自的名称匹配的目标?

斯科特·波士顿

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上方和cumsum沿行NaN创建'LevelX'列
  • map通过调用explode上面的“代码”列中的“代码”列来创建要使用的pd.Series ,并drop_duplicates保留“代码”的最后一个值,然后set_index在“代码”中保留“名称”列,以创建“ s_map”。
  • 重命名df_level列以获得Level1而不是Level0。
  • 使用pd.concat与列表解析mapdf_level列使用s_map df_level_names。另外,使用keys参数重命名新列并附加“名称”
  • 用于join将df与df_levels和df_level_names连接,然后drop将“代码”列连接起来,以创建所需的输出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据另一列的值在熊猫中创建新列

根据另一列熊猫的300条相邻行中的值创建新列

跟进-根据熊猫中另一列的值创建新列

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

根据熊猫中另一列上的值在数据框中创建一个新列

熊猫根据选择为条件的另一列中的值创建一列

根据另一列熊猫的值添加新列

熊猫根据另一列选定的值创建新列

根据另一列的值创建新列

根据另一列的值创建新列

如何根据熊猫另一列中的条件生成具有值的新列

熊猫根据另一列中的值替换值

如何根据另一列的值在熊猫中创建列

根据另一列的值在熊猫中创建值的串联

如何根据条件在熊猫中创建另一列?

通过计算熊猫另一列中的不同值来创建新列

是否可以根据值在另一列中更改的时间来创建新列?

使用 map() 时出错:根据另一列中的值创建新的 Pandas 列

根据另一列中的字符串值创建新列

根据r中另一列的观测值创建新列

根据列表中的另一列内容创建新的列值

根据另一列中的值的最后两位数字创建新列

如何根据另一列 SQL 中的值创建具有计数值的新列

根据前一列中的值创建新列

根据另一列中的最大值为熊猫数据框中的给定子索引创建一个新列

根据熊猫中的缺失值创建一列

在熊猫中,如何从一列中的唯一值中创建列,然后根据另一列中的值填充它?

如何根据熊猫中另一列的下限值对一列中的值求和?

根据熊猫中数据框的另一列的值添加一列