【问题标题】:Replacing NaN value with a word when NaN is not repeated in two consecutive rows当连续两行不重复 NaN 时,将 NaN 值替换为单词
【发布时间】:2017-06-26 02:52:44
【问题描述】:

对于以下数据框:

index   Sent    col_1   col_2   col_3
    1   AB       NaN      DD     CC
    1             0       1       0
    2   SA        FA      FB      NaN
    2             1       1       NaN
    3   FF       Sha      NaN     PA
    3             1        0       1

当 NAN 在两个连续行中不重复时,我需要将 col_1、col_2、col_3 中的 NAN 值替换为“F”。输出是这样的:

     index   Sent   col_1   col_2   col_3
        1   AB        F       DD     CC
        1             0       1       0
        2   SA        FA      FB      NaN
        2             1       1       NaN
        3   FF       Sha      F       PA
        3             1       0       1

This is my code:
for col in ['col_1', 'col_2', 'col_3']:
    data = np.reshape(df[col].values, (-1, 2))
    need_fill = np.logical_and(data[:, 0] == '', data[:, 1] != '')
    data[np.where(need_fill),1] = 'F'

但是它将 NAN 值下的 0 替换为 F。我如何修复将 NAN 替换为 F 的代码。

【问题讨论】:

  • NANNaN 的含义相同吗?NA 是否也与NaN 相同?
  • 是的,它们是一样的,对不起
  • 那么对于第二个NAcol_3 不应该被F 替换吗?
  • 否,因为它上面的值也是NaN。如果 NaN 下的值为 0 或 1,我们将其转换为 F。
  • 简单地更改测试有什么问题?

标签: python pandas


【解决方案1】:

可能有更好的方法,但一种方法是尝试使用shift 来查看上方的row 和下方的row。但是,对于第一行和最后一行,它会产生问题。因此,如果添加额外的行并稍后删除它不是问题,您可以尝试以下操作:

# Appending row to the top: https://stackoverflow.com/a/24284680/5916727
df.loc[-1] = [0 for n in range(len(df.columns))]
df.index = df.index + 1  # shifting index
df = df.sort_index()  # sorting by index

# Append row to below it
df.loc[df.shape[0]] = [0 for n in range(len(df.columns))]
print(df)

   index Sent col_1 col_2 col_3
0      0    0     0     0     0
1      1   AB   NaN    DD    CC
2      1          0     1     0
3      2   SA    FA    FB   NaN
4      2          1     1   NaN
5      3   FF   Sha   NaN    PA
6      3          1     0     1
7      0    0     0     0     0

现在,使用shiftmasking by shift(-1)shift(1) 检查连续行:

columns = ["col_1", "col_2","col_3"]
for column in columns:
    df.loc[df[column].isnull() & df[column].shift(-1).notnull() &  df[column].shift(1).notnull(), column] = "F"
df = df [1:-1] # remove extra rows
print(df)

输出:

   index Sent col_1 col_2 col_3
1      1   AB     F    DD    CC
2      1          0     1     0
3      2   SA    FA    FB   NaN
4      2          1     1   NaN
5      3   FF   Sha     F    PA
6      3          1     0     1

如果您愿意,您也可以删除额外的 index 列,该列似乎有重复项。

更新(添加测试用的 .csv 数据)

我在测试csv文件中有关注。

index,Sent,col_1,col_2,col_3
1,AB,,DD,CC
1, ,0,1,0
2,SA,FA,FB,NA
2, ,1,1,NA
3,FF,Sha,,PA
3, ,1,0,1

然后,您可以使用以下内容创建输入dataframe

import pandas as pd
df = pd.read_csv("FILENAME.csv")

【讨论】:

  • 非常感谢。当我将您的解决方案应用于我的文件时,没有输出,甚至没有错误。是否可以上传这种数据并进行测试?
  • @Mary 更新了 .csv 文件的内容。您可以使用read_csv 获取输入dataframe
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 2020-03-12
  • 2018-03-12
  • 1970-01-01
  • 2020-01-01
  • 2012-11-23
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多