所以我有一个像这样的数据表
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,我是否应该注意内存溢出?
答案 0 :(得分:1)
我认为您可以通过使用set_index
将'theta'和'phi'设置为索引,然后使用reindex
将pd.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