Pandas 如何用现有列值替换DataFrame列的NaN值?

Pandas 如何用现有列值替换DataFrame列的NaN值?,pandas,pandas-groupby,Pandas,Pandas Groupby,数据帧df示例: EateryItem 0 Burger 1 pizza 2 Donut 3 NaN 4 NaN 5 NaN 6 . . . . . 15 NaN 为了填写前面的项目,我发现解决方案如下 df.bfill().ffill() 我的预期结果是使用现有列值填充NaN不一定是相同的顺序,也可能是随机的: EateryItem 0 Burger 1 pizza 2 Donut 3 Burger 4 pizza 5 Donut 6 Burger 7 pizza 8 Donut

数据帧df示例:

  EateryItem
0 Burger
1 pizza
2 Donut
3 NaN
4 NaN
5 NaN
6  .
.  .
.  .
15 NaN
为了填写前面的项目,我发现解决方案如下

df.bfill().ffill()
我的预期结果是使用现有列值填充NaN不一定是相同的顺序,也可能是随机的:

EateryItem
0 Burger
1 pizza
2 Donut
3 Burger
4 pizza
5 Donut
6 Burger
7 pizza
8 Donut
9 Burger
10 pizza
11 Donut
.   .
.   . 
你可以: 创建一个随机数组,从非NaN元素到NaN元素的长度:intdf.EateryItem.isna.sum,然后使用筛选NaN元素并分配此数组

s=np.random.choice(df.EateryItem.dropna(),int(df.EateryItem.isna().sum()))
df.loc[df.EateryItem.isna(),'EateryItem']=s
print(df)
用于从EateryItem获取项目的随机样本

值\u到\u fill=df['EateryItem']\ 多普纳先生\ .samplen=df['EateryItem'].isna.sum,随机_状态=1,替换=True df.loc[df['EateryItem'].isna,'EateryItem']=值 编辑 dropna返回仅包含有效值的pandas.core.series.series:

df['EateryItem'].dropna 汉堡包 一份比萨饼 2个甜甜圈 名称:EateryItem,数据类型:object 从这些值中,我想得到一个随机样本,因此我使用。样本:

df['EateryItem'].dropna\ .samplen=df['EateryItem'].isna.sum,随机_状态=1,替换=True 一份比萨饼 汉堡包 汉堡包 一份比萨饼 名称:EateryItem,数据类型:object n这里有许多要退回的项目。在本例中,我需要一个等于所有缺失值之和的数字,因此.isna.sum:

df['EateryItem'].isna.sum 4. random_state=1是一个种子,添加该种子是为了可复制性

“替换”指定是否替换样本。如果为False,根据默认设置,将出现错误:ValueError:当“replace=False”时,无法获取比总体更大的样本

使用.to_numpy将级数的值转换为数组,给出:

值\u到\u填充。到\u numpy 数组['pizza','Burger','Burger','pizza',],dtype=object 现在我有了一个包含项的数组,我可以使用它们来填充原始序列中缺少的值

df.loc[df['EateryItem'].isna,'EateryItem']=值 使用.isna和.loc,我筛选了缺少值的行:

df.loc[df['EateryItem'].isna] 饮食项目 3南 4楠 5南 6南 之后,我指定要用数组值_to_fill.to_numpy:…,'替换上面缺少的值EateryItem']=值\u到\u fill.to\u numpy

我试过这个

s = df.item.dropna().unique().tolist()
m = df.item.isnull()
temp = s*int(len(df)/len(s))
temp = temp[:len(df[m])]
df.loc[m, 'item'] = temp
O/p:


注意:这也将保持顺序:

现有值的随机性,对吗?是的,披萨、汉堡、甜甜圈…@Codenewbie updated,你也可以使用replace=False,s=np.random.choicedf.EateryItem.dropna,intdf.EateryItem.isna.sum,replace=False我理解代码片段,但无法像你那样把它们放在一起……哇,超级感谢这让我明白了每一点伙计!!对不起,我正在学习熊猫,我想理解和学习这里的每一段代码,我知道s=['burger'、'pizza'、'donut'],m对所有NaN都是真的,temp=['burger'、'pizza'、'donutburger'、'pizza'、'donutburger'、'pizza'、'donut'],我不理解下一部分,如果我的假设是错误的,请纠正我的错误。……thankss只包含有效元素。m包含布尔级数,如果该行为NaN,则为True。temp包含有效元素的重复值。现在,temp保存项的所有值,但我们只需要NaN值。因此,它分割所需的值。现在,我们将temp中的值由NaN保存在item中。我希望你现在清白了。我建议你一行一行地运行,并检查中间结果。快乐编码:
    EateryItem
0   Burger
1   pizza
2   Donut
3   pizza
4   Burger
5   Burger
6   pizza
...
s = df.item.dropna().unique().tolist()
m = df.item.isnull()
temp = s*int(len(df)/len(s))
temp = temp[:len(df[m])]
df.loc[m, 'item'] = temp
      item
0   burger
1    pizza
2    donut
3   burger
4    pizza
5    donut
6   burger
7    pizza
8    donut
9   burger
10   pizza
11   donut
12  burger
13   pizza
14   donut