python - 一种在多个数据集中映射数据的更好方法,具有多个数据映射规则

标签 python pandas dataframe data-analysis data-mapping

我有三个数据集( final_NNppt_codeherd_id ),我想在 MapValue 数据帧中添加一个名为 final_NN 的新列,要添加的值可以从其他两个数据帧中检索,规则在代码后的底部。

import pandas as pd

final_NN = pd.DataFrame({
    "number": [123, 456, "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown"],
    "ID": ["", "", "", "", "", "", "", "", 799, 813],
    "code": ["", "", "AA", "AA", "BB", "BB", "BB", "CC", "", ""]
})

ppt_code = pd.DataFrame({
    "code": ["AA", "AA", "BB", "BB", "CC"],
    "number": [11, 11, 22, 22, 33]
})

herd_id = pd.DataFrame({
    "ID": [799, 813],
    "number": [678, 789]
})

new_column = pd.Series([])
for i in range(len(final_NN)):
    if final_NN["number"][i] != "" and final_NN["number"][i] != "Unknown":
        new_column[i] = final_NN['number'][i]

    elif final_NN["code"][i] != "":
        for p in range(len(ppt_code)):
            if ppt_code["code"][p] == final_NN["code"][i]:
                new_column[i] = ppt_code["number"][p]

    elif final_NN["ID"][i] != "":
        for h in range(len(herd_id)):
            if herd_id["ID"][h] == final_NN["ID"][i]:
                new_column[i] = herd_id["number"][h]

    else:
        new_column[i] = ""

final_NN.insert(3, "MapValue", new_column)
print(final_NN)
final_NN:
    number   ID code
0      123          
1      456          
2  Unknown        AA
3  Unknown        AA
4  Unknown        BB
5  Unknown        BB
6  Unknown        BB
7  Unknown        CC
8  Unknown  799     
9  Unknown  813 
ppt_code:
  code  number
0   AA      11
1   AA      11
2   BB      22
3   BB      22
4   CC      33
herd_id:
    ID  number
0  799     678
1  813     789
预期输出:
    number   ID code   MapValue
0      123                  123
1      456                  456
2  Unknown        AA         11
3  Unknown        AA         11
4  Unknown        BB         22
5  Unknown        BB         22
6  Unknown        BB         22
7  Unknown        CC         33
8  Unknown  799             678
9  Unknown  813             789
规则是:
  • 如果 final_NN 中的 number 不是 UnknownMapValue = number 中的 final_NN
  • 如果final_NN中的numberUnknowncode中的final_NN不为Null,则搜索ppt_code数据帧,使用code及其对应的“number”映射并填写final_NN中的“MapValue”;
  • 如果number中的codefinal_NN分别为Unknown和null,但ID中的final_NN不为Null,则搜索herd_id数据帧,将ID及其对应的number填入第一个MapValue数据帧。我在数据帧中应用了一个循环,这是实现此目的的缓慢方法,如上所述。但我知道可能有更快的方法来做到这一点。只是想知道有人会帮助我有一种快速简便的方法来实现相同的结果吗?
  • 最佳答案

    首先从 ppt_codeherd_id 数据帧创建一个映射系列,然后使用 Series.replace 创建一个新列 MapNumber 通过用 Unknown 替换 number 列中的 np.NaN 值,然后使用两个连续的 Series.fillna Series.map 来根据 o 填充缺失值到 MapNumber 列规则:

    ppt_map = ppt_code.drop_duplicates(subset=['code']).set_index('code')['number']
    hrd_map = herd_id.drop_duplicates(subset=['ID']).set_index('ID')['number']
    
    final_NN['MapNumber'] = final_NN['number'].replace({'Unknown': np.nan})
    final_NN['MapNumber'] = (
        final_NN['MapNumber']
        .fillna(final_NN['code'].map(ppt_map))
        .fillna(final_NN['ID'].map(hrd_map))
    )
    
    结果:
    # print(final_NN)
    
        number   ID code  MapNumber
    0      123                123.0
    1      456                456.0
    2  Unknown        AA       11.0
    3  Unknown        AA       11.0
    4  Unknown        BB       22.0
    5  Unknown        BB       22.0
    6  Unknown        BB       22.0
    7  Unknown        CC       33.0
    8  Unknown  799           678.0
    9  Unknown  813           789.0
    

    关于python - 一种在多个数据集中映射数据的更好方法,具有多个数据映射规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62527486/

    相关文章:

    python - 运行并从后台进程获取输出

    python - 为什么 pandas groupby().transform() 需要唯一索引?

    Python - 使用 Ipyvolume 库在 x、y 和 z 轴上绘制不同颜色的问题

    python - 在导出到 Excel 之前如何命名 DataFrame 中的行和列?

    python - 在python中对名称列表进行排序

    python - 计算总月累计订单数

    python - 将功能应用于 Pandas groupby

    python - 我需要使用 numpy 的矢量化来优化我的双 for 循环

    python - 整个数据帧python的最小最大缩放

    javascript - 如何在Python中使用sed?