首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python填充缺失数据

Python填充缺失数据
EN

Stack Overflow用户
提问于 2018-07-22 03:37:47
回答 1查看 450关注 0票数 2

所以我有一个表,它是这样的数据

代码语言:javascript
复制
theta    phi    x   y

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

theta值从0到90,每个thetaφ从0到360,但是表中缺少一些φ,我必须填充这些值。我试着用熊猫来做这样的工作,

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-22 03:58:33

我认为你可以这样做:用set_index设置'theta‘和'phi’作为索引,然后用pd.MultiIndex.from_product用你期望的'theta‘和'phi’的所有值进行reindex,用interpolate填充NaN值,最后用reset_index填充,例如:

代码语言:javascript
复制
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的所有值。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51459489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档