所以我有一个表,它是这样的数据
theta phi x y
0 0 1 2
0 1 2 3
--------------------
90 360 4 5
theta值从0到90,每个thetaφ从0到360,但是表中缺少一些φ,我必须填充这些值。我试着用熊猫来做这样的工作,
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?
发布于 2018-07-22 03:58:33
我认为你可以这样做:用set_index
设置'theta‘和'phi’作为索引,然后用pd.MultiIndex.from_product
用你期望的'theta‘和'phi’的所有值进行reindex
,用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
https://stackoverflow.com/questions/51459489
复制相似问题