pandas fillna 基于另一个数据帧的条件

问题描述 投票:0回答:1

表1

身份证 状况 访问1 访问2
1
2 bb
3
4 bb
5
6 bb

表2

姓名 状况 配件1 配件2
约翰 是的 没有
玛丽 没有 是的
鲍勃 是的 是的
bb 是的 是的
彼得 bb 没有 是的

表1中的fillna是基于表2条件accessor1、accessor2上的条件。如果是并且两个条件相同,则填写 nan,如果否,则检查另一个条件是否为“是”。

循环或任何其他解决方案来填充所有 NaN?

如何用 python pandas 解决?

期待这样的结果表。

结果表

身份证 状况 访问1 访问2
1 约翰 玛丽
2 鲍勃 鲍勃
3 bb
4 bb 彼得
5 约翰 玛丽
6 bb
python pandas dataframe conditional-statements fillna
1个回答
0
投票

我的想法是使用

table 2
为条件创建cyclic lists,然后填充table 1。我的解决方案是结合使用条件语句和 pandas 广播概念。

举个例子,我们想要用条件

table 1
,
 填充 
Access1
aa

  • table 2
    和条件
    aa
    我们有三个名字要填写
    [John, Mary, Bob]
  • 但是对于
    Accessor1
    列条件,我们只能用
    table 1
     填充 
    [John, Bob]

1。将表 2 的 Accessor 列转换为

dtype bool
,以便我们可以使用 pandas 布尔索引来创建条件

import numpy as np
import pandas as pd
from itertools import cycle

table_1 = pd.DataFrame(
    {
        "ID": list(range(1, 7)),
        "Condition": ['aa', 'aa', 'bb', 'bb', 'aa', 'bb'],
        "Access1": [np.nan]*6,
        "Access2": [np.nan]*6
    }
)

table_2 = pd.DataFrame(
    {
        "Name": ['John', 'Mary', 'Bob', 'Ben', 'Peter'],
        "Condition": ['aa', 'aa', 'aa', 'bb', 'bb'],
        "Accessor1": ['Yes', 'No', 'Yes', 'Yes', 'No'],
        "Accessor2": ['No', 'Yes', 'Yes', 'Yes', 'Yes']
    }
)

table_2['Accessor1'] = table_2['Accessor1'].apply(lambda x: True if x == 'Yes' else False)
table_2['Accessor2'] = table_2['Accessor2'].apply(lambda x: True if x == 'Yes' else False)

2。创建允许我们填充列的列表

condition_aa = table_2[table_2['Condition'] == 'aa']
condition_bb = table_2[table_2['Condition'] == 'bb']
condition_aa_access1 = condition_aa['Name'][condition_aa['Accessor1']].to_list()
condition_aa_access2 = condition_aa['Name'][condition_aa['Accessor2']].to_list()
condition_bb_access1 = condition_bb['Name'][condition_bb['Accessor1']].to_list()
condition_bb_access2 = condition_bb['Name'][condition_bb['Accessor2']].to_list()

3.将列表转换为循环列表,以便我们可以填充需要比我们手中的行更多的行来填充的列的值

condition_aa_access1_cycle = cycle(condition_aa_access1)
condition_bb_access1_cycle = cycle(condition_bb_access1)
condition_aa_access2_cycle = cycle(condition_aa_access2)
condition_bb_access2_cycle = cycle(condition_bb_access2)
condition_access1 = []

4。根据条件创建列大小列表

for i in range(6):
    if table_1.loc[i, 'Condition'] == 'aa':
        condition_access1.append(next(condition_aa_access1_cycle))
    else:
        condition_access1.append(next(condition_bb_access1_cycle))

condition_access2 = []
for i in range(6):
    if table_1.loc[i, 'Condition'] == 'aa':
        condition_access2.append(next(condition_aa_access2_cycle))
    else:
        condition_access2.append(next(condition_bb_access2_cycle))

4。最后用上面的列表填充na

table_1.loc[table_1.Access1.isnull(), 'Access1'] = condition_access1
table_1.loc[table_1.Access2.isnull(), 'Access2'] = condition_access2

table_1

结果

 ID Condition Access1 Access2
  1        aa    John    Mary
  2        aa     Bob     Bob
  3        bb     Ben     Ben
  4        bb     Ben   Peter
  5        aa    John    Mary
  6        bb     Ben     Ben

注意: 这里有很多东西需要优化,很想知道完全依赖于 pandas 概念的新解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.