用上一列中的值填充熊猫数据框中的“无”值

Posted

技术标签:

【中文标题】用上一列中的值填充熊猫数据框中的“无”值【英文标题】:Filling up "None" values in pandas dataframe with values from previous column 【发布时间】:2022-01-21 12:45:37 【问题描述】:

我正在调用一个返回 JSON 文件的 API。当我将 JSON 文件解析为 pandas 数据框时,它会返回下表:

Level 1 Level 2 Level 3
Total Category1 Category 1.2
Total None None
Total Category 2 None
Total Category 2 Category 2.1
Total Category 3 None
Total Category 3 Category 3.1

如您所见,类别分为三个级别。我想用之前列中的值替换列中的“无”值。数据框应如下所示:

Level 1 Level 2 Level 3
Total Category1 Category 1.2
Total Total Total
Total Category 2 Category 2
Total Category 2 Category 2.1
Total Category 3 Category 3
Total Category 3 Category 3.1

我已经尝试了一些循环和以下代码:

for i in range(len(df.columns)):
   df.iloc[:,i] = np.where(df.iloc[:,i] == "None",df.iloc[:,i+1],df.iloc[:,i])

但这不起作用。我怎样才能做到这一点?

谢谢!

【问题讨论】:

【参考方案1】:

确保您的None 实际上是np.nan,然后您的任务将变得简单,因为沿ffill(axis=1) 列的前向填充将满足您的需求:

df.replace('None',np.nan,inplace=True)
df_f = df.ffill(axis=1)

print(df_f)

  Level 1     Level 2       Level 3
0   Total   Category1  Category 1.2
1   Total       Total         Total
2   Total  Category 2    Category 2
3   Total  Category 2  Category 2.1
4   Total  Category 3    Category 3
5   Total  Category 3  Category 3.1

【讨论】:

【参考方案2】:

DataFrame.ffill 适用于 Python None 对象。通过axis=1 跨列填充:

filled = df.ffill(axis=1)

print(filled)
  Level 1     Level 2       Level 3
0   Total   Category1  Category 1.2
1   Total       Total         Total
2   Total  Category 2    Category 2
3   Total  Category 2  Category 2.1
4   Total  Category 3    Category 3
5   Total  Category 3  Category 3.1

【讨论】:

以上是关于用上一列中的值填充熊猫数据框中的“无”值的主要内容,如果未能解决你的问题,请参考以下文章

如果特定列中的值不是熊猫数据框中的整数,则删除行

做某事。如果在熊猫数据框中列中的值等于 1

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

将列中的所有值复制到熊猫数据框中的新列

用 pandas 数据框中另一列的值填充多列中的 Na

填补熊猫数据框中的日期空白