python - 自定义函数来获取数据框值的位置
问题描述
这个问题或多或少类似于我的上一个问题,但差别不大,我有一个 DF
Index Batch Name List Name
0 1 Jon Adam
1
2 2 Adam Sam
3 Chris
4 3 Voges Jon
5
6 4 Jon Voges
我想搜索列表名称中每个值的批号,即 Adam、Sam、Chris、Jon 和 Voges。我想要另一个 DF 如下
Index Batch Name List Name BatchNames
0 1 Jon Adam Adam(2)
1
2 2 Adam Sam Sam(2)
3 Chris Chris(2)
4 3 Voges Jon Jon(1,4)
5
6 4 Jon Voges Voges(3)
我想选择每个列表名称并在名称中搜索它们对应的批号,即Jon
存在于1 and 4
等等。但如果 Listname 中的某个名称在 Name 中不存在,则应选择与其相近的对应 Batch 号,例如Sam
Name 中不存在,但与 相近Batch 2
,则Chris
. 基本上批次之间存在的任何东西都属于最低的批次号。我如何为此编写自定义函数
解决方案
我会做这样的事情:
import pandas as pd
import numpy as np
def custom_function(df):
# Forward fill the Batch number
df_Batch = df.Batch.copy()
df.Batch.ffill(inplace=True)
df.Batch = df.Batch.astype(int)
# Make a new dataframe where we first get batches for the name column
# and append batches for the list name column, there we be duplicates so we keep the first entry
a = df.groupby('Name').Batch.apply(tuple).append(df.groupby('List Name').Batch.apply(tuple)).reset_index().groupby('index').first()
# Create a series which concatenates the Batch number and List Name
b = pd.Series(a.index.astype(str) + a.Batch.astype(str), index=a.index).replace(',','', regex=True).replace(' ',',',regex=True)
# undo the forward fill (replace with original columns)
df.Batch = df_Batch
# join the series we just made to the dataframe
return df.merge(b.to_frame().rename_axis('List Name'), how='left', on='List Name', suffixes=['', 'Names']).fillna('')
df = pd.DataFrame({'Batch':[1,np.nan,2,np.nan,3,np.nan,4], 'Name':['Jon',np.nan, 'Adam',np.nan, 'Voges',np.nan, 'Jon'], 'List Name':['Adam', np.nan, 'Sam', 'Chris', 'Jon', np.nan, 'Voges']})
# Out[122]:
# Batch Name List Name
# 0 1.0 Jon Adam
# 1 NaN NaN NaN
# 2 2.0 Adam Sam
# 3 NaN NaN Chris
# 4 3.0 Voges Jon
# 5 NaN NaN NaN
# 6 4.0 Jon Voges
custom_function(df)
# Out[131]:
# Batch Name List Name BatchNames
# 0 1 Jon Adam Adam(2)
# 1
# 2 2 Adam Sam Sam(2)
# 3 Chris Chris(2)
# 4 3 Voges Jon Jon(1,4)
# 5
# 6 4 Jon Voges Voges(3)
推荐阅读
- android - 我们如何在android中使用firebase Realtime数据库动态设置选项卡布局的选项卡标题?
- tizen - Photocam 几乎无法做任何事情
- swift - CustomAlert 消息覆盖
- package - Ubuntu 20.04 - “apt-get:加载共享库时出错”,字符串不可读
- wpf - 在 UserControl 中设置 ImageSource 不起作用
- python - 如何解决socketio使用Sec-api的这个连接错误?
- javascript - Vue 不会在 main.js 中加载 javascript 文件
- java - 使用 foreach 循环实现对象类型的 ArrayList 的功能
- docker - 您将如何在网页上显示 docker 输出?
- c++ - 在 C++ 中创建双关语结构