Python填充丢失的数据

时间:2018-07-21 19:37:47

标签: python pandas dataframe

所以我有一个像这样的数据表

theta    phi    x   y

0       0      1   2
0       1      2   3
--------------------
90      360    4   5

theta值从0到90,每个theta phi都从0到360, 但有些phi在表中到处都不见了,我必须填写这些 价值观。我正在尝试使用熊猫做这样的工作,

import pandas as pd
cols=['theta','phi','x','y']
data = pd.read_csv('data.dat', sep=" |\t", header=None,names=cols,engine='python')


def fill_up(i):
    df=data[data['theta']==i]
    df.set_index('phi',inplace=True)
    df= df.reindex(range(0,361)).reset_index()
    df=df[cols]
    df.interpolate(inplace=True)
    return df

df=pd.concat([fill_up(i) for i in xrange(0,91)])
df.to_csv("new.txt",sep=' ', index=False, header=False)

如您所见,我正在为每个theta值创建一个单独的数据帧,并最终将它们合并。有什么方法可以在不创建其他数据帧的情况下或更有效地实现这一目标?另外,由于数据文件可能只有几个mb,我是否应该注意内存溢出?

1 个答案:

答案 0 :(得分:1)

我认为您可以通过使用set_index将'theta'和'phi'设置为索引,然后使用reindexpd.MultiIndex.from_product设置为所有'theta'和'phi'的值来实现'您期望,用interpolate填充nan值,最后用reset_index填充,例如:

new_data = (data.set_index(['theta','phi'])
                 .reindex(pd.MultiIndex.from_product( [range(91),range(361)],
                                                      names=['theta','phi']))
                 .interpolate().reset_index())

请注意range(91)range(361)来创建theta和phi的所有值。

编辑空白行,您可以执行以下操作:

new_data = (data.set_index(['theta','phi'])
                 .reindex(pd.MultiIndex.from_product( [range(91),range(362)],
                                                      names=['theta','phi']))
                 .interpolate().reset_index())
new_data.loc[new_data['phi'] ==361] = ''

请注意,phi的范围是range(362),以在下一个命令行中添加您将“空白”行替换为phi = 361的所有行,并用空白

或者,按照原始解决方案中的new_data,您可以创建一个具有特定索引的空白数据框,然后可以concat到new_data,之后可以sort_index

blanck_frame = pd.DataFrame(data='', columns=new_data.columns
                            index=new_data.loc[new_data['phi'] ==360].index+0.5)
new_data = pd.concat([new_data,blanck_frame]).sort_index()
# you can add  .reset_index(drop=True) at the end if you want integer indexes