【问题标题】:Variation of iterating through a single column遍历单个列的变化
【发布时间】:2016-10-05 21:45:56
【问题描述】:

我知道有无数种方法可以遍历数据框中的数据。 我正在从检测器、功率、频率、时间获取数据。时间和功率列在每一行中都有值。频率随时间变化对于每个频率“段”,频率和占空比仅列在该段开头的列中。低于它的样子。

time power frequency duty cycle
1.4  1.2   500.0     45.0
2.1  49.9  NaN       NaN
3.4  245.0 NaN       NaN
4.5  323.0 NaN       NaN
5.6  320.0 NaN       NaN
6.6  309.0 1000      45
7.6  306.0 NaN       NaN
8.7  305.0 NaN       NaN
9.7  304.0 NaN       NaN
10.8 300.0 NaN       NaN

使用:

InitFreqs = df['frequency']
InitDuty = df['dutycycle']
for i in np.arange(1, len(InitFreqs)):
    if np.isnan(InitFreqs[i]):
     InitFreqs[i] = InitFreqs[i - 1]
     InitDuty[i] = InitDuty[i - 1]

我得到了我想要的结果,如下所示:

time power frequency duty cycle
1.4  1.2   500.0     45.0
2.1  49.9  500.0     45.0
3.4  245.0 500.0     45.0
4.5  323.0 500.0     45.0
5.6  320.0 500.0     45.0
6.6  309.0 1000      45.0
7.6  306.0 1000      45.0
8.7  305.0 1000      45.0
9.7  304.0 1000      45.0
10.8 300.0 1000      45.0

此示例中的 45 可能会或可能不会更改,后续值需要反映这一点。虽然这可以完成工作,但它非常缓慢且效率低下。我找到了如何用其他东西或所有 NaN 替换列中的 all 值的示例,但不完全是我想要的。 与for i 语句相比,我应该能够对整个列执行此操作。

【问题讨论】:

    标签: python python-3.x numpy dataframe


    【解决方案1】:

    你想要fillna:

    data = '''time power frequency duty_cycle
    1.4  1.2   500.0     45.0 
    2.1  49.9  NaN       NaN 
    3.4  245.0 NaN       NaN 
    4.5  323.0 NaN       NaN 
    5.6  320.0 NaN       NaN 
    6.6  309.0 1000      450 
    7.6  306.0 NaN      NaN 
    8.7  305.0 NaN      NaN 
    9.7  304.0 NaN      NaN 
    10.8 300.0 NaN      NaN'''
    
    dd = [d.split() for d in data.split('\n')]
    df = pd.DataFrame(dd[1:],columns=dd[0])
    df.replace('NaN',np.nan,inplace=True)
    
    
    df.fillna(method='ffill',axis=0)
    
    time    power   frequency   duty_cycle
    0   1.4     1.2     500.0   45.0
    1   2.1     49.9    500.0   45.0
    2   3.4     245.0   500.0   45.0
    3   4.5     323.0   500.0   45.0
    4   5.6     320.0   500.0   45.0
    5   6.6     309.0   1000    450
    6   7.6     306.0   1000    450
    7   8.7     305.0   1000    450
    8   9.7     304.0   1000    450
    9   10.8    300.0   1000    450
    

    【讨论】:

    • 嗨,鲍勃,感谢您的回复。在这种情况下,我的数据框的名称为 B。我在复制你的代码时一定犯了一个错误,当输入它用 B 替换 df 和 data 时,我收到“Dataframe”对象没有属性“split”的错误,我在这里做错了什么?我也不确定我是否理解前两行代码......
    • 如果你有一个B的数据框,你需要运行的唯一行是B.fillna(method='ffill',axis=0)
    • 它有效,就是这么简单。还有一个问题,数据框的前 2 或 3 行恰好有几个 NaN,为什么整个数据框没有被 NaN 填充?并感谢您的帮助!
    • 太棒了!该函数仅从非 nan 的值中填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多