首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个数据映射规则在多个数据集中映射数据的更好方法

使用多个数据映射规则在多个数据集中映射数据的更好方法
EN

Stack Overflow用户
提问于 2020-06-23 04:43:38
回答 2查看 704关注 0票数 5

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
  code  number
0   AA      11
1   AA      11
2   BB      22
3   BB      22
4   CC      33

herd_id:

代码语言:javascript
复制
    ID  number
0  799     678
1  813     789

预期产出:

代码语言:javascript
复制
    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;

  • if中的
  1. number在final_NN中不是UnknownMapValue = number在final_NN中是Unknown,而codefinal_NN中不是空,则搜索ppt_code数据,并使用code及其对应的“数字”映射和填充D24中的"MapValue“;如果
  2. 中的number和code分别为Unknown和Null,但final_NN中的ID不是null,则搜索herd_id数据,并使用ID及其对应的number在第一个数据中填充MapValue。我在dataframe中应用了一个循环,这是实现这一目标的一种缓慢方法,如前所述。但我知道有更快的方法可以做到这一点。我只是想知道,有谁能帮我找到一种快速简便的方法来实现同样的结果呢?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-23 05:23:19

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

代码语言:javascript
复制
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))
)

结果:

代码语言:javascript
复制
# 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
票数 4
EN

Stack Overflow用户

发布于 2020-06-23 05:45:56

我们简单地将这三个数据框架组合在一起。

原始DF删除“未知”row.

  • 'ppt_code‘,更改列names.

  • 'pandas.concat()’将它们连接在一起。

代码语言:javascript
复制
final_NN['number'].replace('Unknown', np.NaN, inplace=True)
final_NN.dropna(inplace=True, how='any')
ppt_code.rename(columns={'code':'ID'}, inplace=True)
new_df = pd.concat([final_NN, ppt_code, herd_id], axis=0, ignore_index=True)

new_df
    number  ID  code
0   123.0       
1   456.0       
2   11.0    AA  NaN
3   11.0    AA  NaN
4   22.0    BB  NaN
5   22.0    BB  NaN
6   33.0    CC  NaN
7   678.0   799 NaN
8   789.0   813 NaN
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62527486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档