【问题标题】:Inserting rows into dataframe by reindexing通过重新索引将行插入数据框
【发布时间】:2015-10-13 19:50:38
【问题描述】:

我有一个dataset 以温度为一列。由于加热器的工作方式,数据中存在许多空白。为了让不同的数据集直接可比,我想把这些缺失的温度补上,并在另一列添加对应的NaN。

我尝试使用这里给出的答案,这似乎正是我想要的:link。 但这不起作用 - 我得到了一个包含我想要的新温度值的数据框,但相应的数据已经消失:

import pandas as pd 
import numpy as np           
A1 = pd.read_table('Test data.tsv', encoding='ISO-8859-1', header = 2) 
A1.columns = ['time',2,3,4,5,6,7,'freq',9,10,11,12,13,'temp',15,16,17,18,19] 
A1truncated = A1[A1.temp >= 25]; A1truncated=A1truncated[A1truncated.temp <= 350.1]
A1averaged = A1truncated.groupby(['temp'], as_index=False)['freq'].mean() 
A1averaged = np.around(A1averaged, decimals=1)

A1averaged.set_index('temp') 
new_index = pd.Index(np.arange(25, 350, 0.1), name='temp')
A1indexed = A1averaged.set_index('temp').reindex(new_index).reset_index() 

将我的 19 列变成 1 列,以温度为索引(A1 平均),然后变成 2 列,带有新的温度列表和一列空数据(A1 索引)。 任何想法为什么这不起作用?或者其他方法可以做到这一点?

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    带有浮点数的索引可以reindex 有问题,不一致可能是因为浮点精度。所以我使用小技巧 - Int64Index 而不是 Float64Index

    我尝试以更简单的方式设置子集:

    A1truncated = A1[(A1.temp >= 25) & ( A1.temp <= 350.1)]
    

    然后省略第一次设置索引,因为设置了两次:

    A1averaged.set_index('temp')
    

    new_index 设置为Int64Index

    new_index = pd.Index(np.arange(250, 3500), name='temp')
    

    并使用Int64Index 乘以列temp 乘以10,最后这一列除以10

    A1averaged['temp'] = A1averaged['temp'] * 10
    A1indexed['temp'] = A1indexed['temp'] / 10
    

    大家一起:

    import pandas as pd 
    import numpy as np           
    A1 = pd.read_table('Test data.tsv', encoding='ISO-8859-1', header = 2) 
    
    A1.columns = ['time',2,3,4,5,6,7,'freq',9,10,11,12,13,'temp',15,16,17,18,19] 
    
    A1truncated = A1[(A1.temp >= 25) & ( A1.temp <= 350.1)]
    
    A1averaged = A1truncated.groupby(['temp'], as_index=False)['freq'].mean() 
    A1averaged = np.around(A1averaged, decimals=1)
    new_index = pd.Index(np.arange(250, 3500), name='temp')
    
    A1averaged['temp'] = A1averaged['temp'] * 10
    A1indexed = A1averaged.set_index('temp').reindex(new_index).reset_index()
    A1indexed['temp'] = A1indexed['temp'] / 10
    print A1indexed.tail()
    #       temp       freq
    #3245  349.5  5830065.6
    #3246  349.6  5830043.5
    #3247  349.7  5830046.3
    #3248  349.8  5830025.3
    #3249  349.9  5830015.6
    

    【讨论】:

    • 完美,非常感谢!我永远不会注意到浮动问题
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 2020-10-30
    • 1970-01-01
    • 2020-04-16
    • 2016-08-08
    • 2018-09-08
    • 2016-03-30
    相关资源
    最近更新 更多