身份证 | 状况 | 访问1 | 访问2 |
---|---|---|---|
1 | 啊 | 南 | 南 |
2 | bb | 南 | 南 |
3 | 啊 | 南 | 南 |
4 | bb | 南 | 南 |
5 | 啊 | 南 | 南 |
6 | bb | 南 | 南 |
姓名 | 状况 | 配件1 | 配件2 |
---|---|---|---|
约翰 | 啊 | 是的 | 没有 |
玛丽 | 啊 | 没有 | 是的 |
鲍勃 | 啊 | 是的 | 是的 |
本 | bb | 是的 | 是的 |
彼得 | bb | 没有 | 是的 |
表1中的fillna是基于表2条件accessor1、accessor2上的条件。如果是并且两个条件相同,则填写 nan,如果否,则检查另一个条件是否为“是”。
循环或任何其他解决方案来填充所有 NaN?
如何用 python pandas 解决?
期待这样的结果表。
身份证 | 状况 | 访问1 | 访问2 |
---|---|---|---|
1 | 啊 | 约翰 | 玛丽 |
2 | 啊 | 鲍勃 | 鲍勃 |
3 | bb | 本 | 本 |
4 | bb | 本 | 彼得 |
5 | 啊 | 约翰 | 玛丽 |
6 | bb | 本 | 本 |
我的想法是使用
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 概念的新解决方案。