在Pandas中按索引和名称查找值

qgzx9mmu  于 2023-01-11  发布在  其他
关注(0)|答案(2)|浏览(107)

我有一个层次结构扁平化的Pandas Dataframe :
| 1级ID| 2级ID| 3级ID| 4级ID|姓名|路径|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 1个|零|零|零|财务|财务|
| 1个|四个|零|零|报告|财务〉报告|
| 1个|四个|五个|零|税务申报|财务〉报告〉税务报告|
我要做的是基于Level [] ID列添加或替换为具有4个Level Name列的Level ID列,如下所示:
| 一级名称|二级名称|三级名称|四级名称|姓名|路径|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 财务|零|零|零|财务|财务|
| 财务|报告|零|零|报告|财务〉报告|
| 财务|报告|税务申报|零|税务申报|财务〉报告〉税务报告|
我想在Path列上使用分隔符,但在实际的 Dataframe 中,用ID代替名称(格式类似于"1〉4〉5")
我应该如何处理这个问题?
df.info()的输出如下:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 135 entries, 0 to 134
Data columns (total 8 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   name        135 non-null    object
 1   depid       135 non-null    object
 2   depcode     135 non-null    object
 3   parentpath  135 non-null    object
 4   DEP_LV1_ID  135 non-null    object
 5   DEP_LV2_ID  135 non-null    object
 6   DEP_LV3_ID  98 non-null     object
 7   DEP_LV4_ID  56 non-null     object
dtypes: object(8)
memory usage: 8.6+ KB
b4lqfgs4

b4lqfgs41#

逻辑不清楚,特别是最终值的来源是什么?请参见以下两个不同的选项。

假设源为df['Name']
cols = df.filter(like='Level ').columns
names = df['Name'].values
mask = df[cols[:len(names)]].notna()

df[cols[:len(names)]] = mask.mul(names, axis=1).where(mask)

输出:

Level 1 ID Level 2 ID     Level 3 ID  Level 4 ID           Name                                 Path
0    Finance        NaN            NaN         NaN        Finance                              Finance
1    Finance  Reporting            NaN         NaN      Reporting                  Finance > Reporting
2    Finance  Reporting  Tax Reporting         NaN  Tax Reporting  Finance > Reporting > Tax Reporting
如果您更希望从"Path"中提取
cols = df.filter(like='Level ').columns
names = df['Path'].str.split(' > ', expand=True)

df.loc[:, cols[:names.shape[1]]] = names.to_numpy()

输出:

Level 1 ID Level 2 ID     Level 3 ID  Level 4 ID           Name                                 Path
0    Finance       None           None         NaN        Finance                              Finance
1    Finance  Reporting           None         NaN      Reporting                  Finance > Reporting
2    Finance  Reporting  Tax Reporting         NaN  Tax Reporting  Finance > Reporting > Tax Reporting
可重现输入:
import pandas as pd
from numpy import nan

df = pd.DataFrame({'Level 1 ID': [1, 1, 1],
                   'Level 2 ID': [nan, 4.0, 4.0],
                   'Level 3 ID': [nan, nan, 5.0],
                   'Level 4 ID': [nan, nan, nan],
                   'Name': ['Finance', 'Reporting', 'Tax Reporting'],
                   'Path': ['Finance', 'Finance > Reporting', 'Finance > Reporting > Tax Reporting']}
                 )
sh7euo9m

sh7euo9m2#

您可以创建一个Map系列来解析编号-〉名称:

url = 'https://drive.google.com/uc?id=1-2YXvyb8QEtHrrAO0UCH6vSJ5ww6CCjK&export=download'
df = pd.read_excel(url, index_col=0)

cols = df.columns[df.columns.str.contains('DEP_LV\d_ID')]
idx = df[cols].ffill(axis=1).iloc[:, -1].tolist()

sr = pd.Series(df['name'].tolist(), index=idx)
df[cols] = df[cols].apply(lambda x: x.map(sr))

输出:

>>> df
                                           name  depid depcode         parentpath                 DEP_LV1_ID                                  DEP_LV2_ID                            DEP_LV3_ID     DEP_LV4_ID
0                         Дотоод аудитын хэлтэс    152   61100              |152|      Дотоод аудитын хэлтэс                                         NaN                                   NaN            NaN
1                       Санхүү бүртгэлийн газар    214   31000              |214|    Санхүү бүртгэлийн газар                                         NaN                                   NaN            NaN
2    Хүний нөөцийн бодлого, төлөвлөлтийн хэлтэс    211   32100          |209|211|        Хүний нөөцийн газар  Хүний нөөцийн бодлого, төлөвлөлтийн хэлтэс                                   NaN            NaN
3                      Санхүү бүртгэлийн хэлтэс    215   31100          |214|215|    Санхүү бүртгэлийн газар                    Санхүү бүртгэлийн хэлтэс                                   NaN            NaN
4                           Хүний нөөцийн газар    209   32000              |209|        Хүний нөөцийн газар                                         NaN                                   NaN            NaN
..                                          ...    ...     ...                ...                        ...                                         ...                                   ...            ...
130                               Оёх нэгж (C1)    816   20512  |511|522|811|816|   Үйлдвэр удирдлагын газар                          Сүлжмэлийн үйлдвэр                   Сүлжмэлийн 1-р алба  Оёх нэгж (C1)
131                            Галлериа УБ нэгж    867   11209      |857|859|867|  Дотоод борлуулалтын газар                  Дотоод борлуулалтын хэлтэс                      Галлериа УБ нэгж            NaN
132        Хими цэвэрлэгээ, нөхөн засварын алба    870   11230      |857|859|870|  Дотоод борлуулалтын газар                  Дотоод борлуулалтын хэлтэс  Хими цэвэрлэгээ, нөхөн засварын алба            NaN
133                                 Дархан нэгж    868   11205      |857|859|868|  Дотоод борлуулалтын газар                  Дотоод борлуулалтын хэлтэс                           Дархан нэгж            NaN
134                            Төв дэлгүүр нэгж    869   11201      |857|859|869|  Дотоод борлуулалтын газар                  Дотоод борлуулалтын хэлтэс                      Төв дэлгүүр нэгж            NaN

[135 rows x 8 columns]

相关问题