【问题标题】:Fill the selected row so that they have equal numbers of non-NaN value填充选定的行,使它们具有相等数量的非 NaN 值
【发布时间】:2018-03-05 22:09:57
【问题描述】:

我的流程图如上图所示,我想从原始数据集中取出 2 行,然后将它们导入另一个(因为我不想修改原始数据)。在新的数据集中,检查2行是否有相同数量的非NaN值(df.iloc[i,:].count()),如果不一样,将数量差补​​零,然后继续执行操作。

示例: 原始数据:

3    5    5    NaN  NaN  NaN
1    4    7    5    NaN  NaN
NaN  NaN  3    6    7    NaN
NaN  3    8    4    11   NaN
3    0    3    7    2    1

取 2 行 i 和 i+1 并将它们导入另一个数据集:

3    5    5    NaN  NaN  NaN
1    4    7    5    NaN  NaN

因为df.iloc[i+1,:].count() != df.iloc[i,:].count(),所以NaN值多的那一行必须这样填充:

3    5    5    0    NaN  NaN
1    4    7    5    NaN  NaN

如果是第 3 行和第 4 行

NaN  0    3    6    7    NaN
NaN  3    8    4    11   NaN

然后执行操作。

这是我的代码:

for i in range():
process[1,:] = df.iloc[i,:]
process[2,:] = df.iloc[i+1,:]
    while True:
        if process[1,:].count() == process[2,:].count():
            break
        else:
            if process[1,:].count() > process[2,:].count():
                process[2,:] = process[2,:].fillna(value = 0, limit = process[1,:].count() - process[2,:].count())
            else:
                process[2,:] = process[2,:].fillna(value = 0, limit = process[2,:].count() - process[1,:].count())                
    A[i,:] = stats.ttest_rel(process[1,:].values, process[2,:].values) #this line is just for the statistical test, you can ignore it
    i += 1

我的算法不起作用,我觉得他们一遍又一遍地检查它们有点太笨拙了。

欢迎大家提出建议和指正,非常感谢。

P/s:我想连续对每一行进行统计检验,所以在这样做之前,我需要使它们具有相等数量的非 NaN 值。

【问题讨论】:

  • 第三和第四行呢?
  • 因为这只是我算法的一小部分,我不想包含太多与问题没有直接关系的东西。在执行完后面的操作后,会有一个循环不断比较它们的长度并进行处理。
  • 对于您的代码中有许多无法回答的问题...为什么j+=1i+=1 在那里,为什么j 有一个循环,它从未使用过。 A 是什么?一个列表?一个 numpy 数组。请阅读minimal reproducible example 并改写这个问题。目前无法回答
  • 我已经编辑了我的代码。谢谢你的建议。

标签: python pandas for-loop while-loop


【解决方案1】:

终于可以想出答案了,想在这里分享一下:

for i in range(5):
    process = pd.DataFrame(columns=df.columns)
    process = process.append(df.iloc[i,:], ignore_index = True)
    process = process.append(df.iloc[i+1,:], ignore_index = True)
    while True:
        if process.iloc[0,:].count() == process.iloc[1,:].count():
            break
        else:
            if process.iloc[0,:].count() > process.iloc[1,:].count():
                process.iloc[1,:] = process.iloc[1,:].fillna(value = 0, limit = process.iloc[0,:].count() - process.iloc[1,:].count())
            else:
                process.iloc[0,:] = process.iloc[0,:].fillna(value = 0, limit = process.iloc[1,:].count() - process.iloc[0,:].count())                
    i += 1

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2021-12-24
    • 2021-11-17
    • 2021-06-12
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多