迭代填充空熊猫
Posted
技术标签:
【中文标题】迭代填充空熊猫【英文标题】:Iterate to fill nulls pandas 【发布时间】:2021-12-29 14:29:30 【问题描述】:我有一个表,我想在其中填充一些空值作为列之间的条件规则。一张桌子看起来像这样:
Master | ID_A | Col_A | Col_B | Col_C |
---|---|---|---|---|
X | 1 | a | NaN | NaN |
X | 2 | g | f | o |
X | 3 | t | s | o |
Y | 4 | a | d | c |
Y | 5 | e | r | Nan |
我的想法是:
在每一行中,查找空值。 当我找到一个空值时,寻找具有相同主数据的另一行并用该行的 ID_A 填充空值 在这种情况下,Col_B 为 2,Col_C 为 3(第一行) 第五行的 Col_C 将是 4我该怎么做?我仍然觉得很难构建循环,但我想了解更多!谢谢
【问题讨论】:
为什么第一行是 2 然后 3?你需要遍历ID_A
吗?如果特定行的nan
s 比ID_A
多怎么办?从 2 点重启?
【参考方案1】:
这比我想象的要难!这是一种蛮力的方法:
import pandas as pd
import numpy as np
df = pd.DataFrame('Master': ['X','X','X','Y','Y'],
'ID_A': range(1,6),
'Col_A': ['a','g','t','a','e'],
'Col_B': [np.nan,'f','s','d','r'],
'Col_C': [np.nan,'o','o','c',np.nan])
master_vals = df['Master'].unique()
for val in master_vals:
df_master = df[df['Master'] == val]
for row in df_master.index:
counter = 0
for col in ['Col_A','Col_B','Col_C']:
if pd.isnull(df_master.loc[row,col]):
full_df = df_master.dropna()
index = full_df.index
df.loc[row,col] = full_df.loc[index[0]+counter,'ID_A']
counter += 1
对于我们的每个主值[X,Y]
,我们只选择数据框中的那些行到df_master
。然后从df_master
遍历我们关心的行和列,寻找NaN。如果我们找到一个,那么我们搜索full_df
(df_master
中不包含任何 NaN 的部分),并使用计数器选择和适当的值来帮助索引。这给我们留下了:
df
Master ID_A Col_A Col_B Col_C
0 X 1 a 2 3
1 X 2 g f o
2 X 3 t s o
3 Y 4 a d c
4 Y 5 e r 4
如果您的数据集很大,这种方法可能会非常慢,并且还可能产生意外行为,除非您的数据的结构与给出的示例完全相同。使用groupby
和stack
可能会更好地完成整个任务,但我无法让它们工作。
【讨论】:
以上是关于迭代填充空熊猫的主要内容,如果未能解决你的问题,请参考以下文章