我有一个多索引DataFrame,其名称附加到列级别.我希望能够轻松地改变列周围的列,以便它们匹配用户指定的顺序.由于这是在管道中,我无法使用此推荐的解决方案并在创建时正确地订购它们.
我有一个看起来像(像)的数据表
Experiment BASE IWWGCW IWWGDW
Lead Time 24 48 24 48 24 48
2010-11-27 12:00:00 0.997 0.991 0.998 0.990 0.998 0.990
2010-11-28 12:00:00 0.998 0.987 0.997 0.990 0.997 0.990
2010-11-29 12:00:00 0.997 0.992 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986 0.996 0.986
Run Code Online (Sandbox Code Playgroud)
我想要列出一个列表,['IWWGCW', 'IWWGDW', 'BASE']并重新排序为:
Experiment IWWGCW IWWGDW BASE
Lead Time 24 48 24 48 24 48
2010-11-27 12:00:00 0.998 0.990 0.998 …Run Code Online (Sandbox Code Playgroud) 我正在使用优秀的pandas软件包来处理大量不同的气象诊断数据,而且当我将数据拼接在一起时,我很快就会耗尽尺寸.查看文档,可能是使用MultiIndex可以解决我的问题,但我不知道如何将其应用于我的情况 - 文档显示了使用随机数据和DataFrames 创建MultiIndex的示例,但没有预先存在的Series时间序列数据.
背景
我使用的基本数据结构包含两个主要字段:
metadata,这是一个字典,由描述数字的键值对组成data,这是一个包含数字本身的pandas数据结构.最小公分母是时间序列数据,因此基本结构有一个pandas Series对象作为data条目,该metadata字段描述了这些数字实际上是什么(例如,东太平洋10米风的矢量RMS误差,24小时预测来自实验Test1).
我正在考虑采用最低通用分母并将各种时间序列粘合在一起,以使结果更有用,并允许轻松组合.例如,我可能想要查看所有不同的提前期 - 我有一个过滤器例程,它将占用我的时间序列共享相同的元数据条目,除了提前期(例如实验,区域等)并返回一个新对象该metadata字段仅包含公共条目(Lead Time即已被删除),现在该data字段是一个大熊猫DataFrame,其中列标签由Lead Time值给出.我可以再次对此进行扩展,并说我想取得结果帧并将它们组合在一起,只有另一个不同的条目(例如Experiment)给我一只大熊猫Panel.对于我的条目,其中项索引由Experiment组成框架的元数据值给出,并且对象的新元数据不包含Lead Time或Experiment.
当我迭代这些复合对象时,我有一个iterseries例程,iterframes用于面板的框架和例程,当我删除一个维度时重建适当的元数据/数据配对(即,来自框架的系列,其中提前时间在列中变化将具有所有其父元数据的元数据加上Lead Time使用从列标签中获取的值恢复的字段.这非常有效.
问题
我已经用完维度(使用Panel最多3-D)并且我也无法dropna在Panel中对齐所有内容之后删除空列(这会在绘制汇总统计信息时导致一些错误).阅读有关使用具有更高维度数据的大熊猫已经阅读了有关MultiIndex它及其使用的内容.我已经尝试过文档中给出的示例,但是我仍然有点不清楚如何将它应用到我的情况中.任何方向都会有用.我希望能够:
Series基于我的数据组合成一个DataFrame沿任意数量维度的多索引(这将是很棒的 - 它将消除一个调用来创建系列中的帧,然后另一个调用从帧创建面板)DataFrame,删除单个维度,以便重置组件元数据.编辑 - …
我正在尝试使用tar处理tarfile的内容multiprocessing.Pool.我能够在多处理模块中成功使用ThreadPool实现,但是希望能够使用进程而不是线程,因为它可能更快并且消除了对Matplotlib处理多线程环境所做的一些更改.我收到的错误是我怀疑与不共享地址空间的进程有关,但我不确定如何解决它:
Traceback (most recent call last):
File "test_tarfile.py", line 32, in <module>
test_multiproc()
File "test_tarfile.py", line 24, in test_multiproc
pool.map(read_file, files)
File "/ldata/whitcomb/epd-7.1-2-rh5-x86_64/lib/python2.7/multiprocessing/pool.py", line 225, in map
return self.map_async(func, iterable, chunksize).get()
File "/ldata/whitcomb/epd-7.1-2-rh5-x86_64/lib/python2.7/multiprocessing/pool.py", line 522, in get
raise self._value
ValueError: I/O operation on closed file
Run Code Online (Sandbox Code Playgroud)
实际的程序更复杂,但这是我正在做的再现错误的一个例子:
from multiprocessing.pool import ThreadPool, Pool
import StringIO
import tarfile
def write_tar():
tar = tarfile.open('test.tar', 'w')
contents = 'line1'
info = tarfile.TarInfo('file1.txt')
info.size = len(contents)
tar.addfile(info, StringIO.StringIO(contents))
tar.close()
def test_multithread():
tar = tarfile.open('test.tar') …Run Code Online (Sandbox Code Playgroud) 我开发了一个Python应用程序来自动发送电子邮件和满足内部办公事件的请求.为了使这些与我的常规通信分开,我们设置了一个备用电子邮件地址,我可以使用该地址发送官方公告.我已经修改了我的应用程序,通过使用SentOnBehalfOfName备用发件人来处理电子邮件- 但是,我无法复制这个以满足会议请求.我的尝试基于一系列网络搜索.但是,在运行时,我收到错误:
Traceback (most recent call last):
File "mailer_test.py", line 49, in <module> test_sender)
File "mailer_test.py", line 38, in send_meeting_request
mtg.Send()
File "<COMObject CreateItem>", line 2, in Send
pywintypes.com_error: (-2147024809, 'The parameter is incorrect.', None, None)
Run Code Online (Sandbox Code Playgroud)
当我为备用发件人添加选项时会发生这种情况 - 删除此选项会导致从我的帐户成功发送邮件.重现错误的测试代码如下 - 我删除了我的实际电子邮件地址,但其他一切都是相同的.
import win32com.client
OUTLOOK_APPOINTMENT_ITEM = 1
OUTLOOK_MEETING = 1
OUTLOOK_ORGANIZER = 0
OUTLOOK_OPTIONAL_ATTENDEE = 2
ONE_HOUR = 60
THIRTY_MINUTES = 30
OUTLOOK_FORMAT = '%m/%d/%Y %H:%M'
outlook_date = lambda dt: dt.strftime(OUTLOOK_FORMAT)
class OutlookClient(object):
def __init__(self):
self.outlook = win32com.client.Dispatch('Outlook.Application')
def …Run Code Online (Sandbox Code Playgroud) 感谢对我最初的问题的回复,我现在有了一个多索引的DataFrame,就像我想要的那样.现在我已经掌握了数据结构中的数据,我试图将其解决,并想知道是否有更好的方法来实现这一点.我的两个问题是相关的,但可能有单独的"理想"解决方案:
示例DataFrame(截断)
Experiment IWWGCW IWWGDW
Lead Time 24 48 24 48
2010-11-27 12:00:00 0.997 0.991 0.998 0.990
2010-11-28 12:00:00 0.998 0.987 0.997 0.990
2010-11-29 12:00:00 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986
Run Code Online (Sandbox Code Playgroud)
迭代
我希望能够循环遍历这个DataFrame,其中迭代只会使我只有1个索引维度,即一个iteritems将返回[('IWWGCW', df['IWWGCW']), ('IWWGDW', df['IWWGDW'])]并产生带有提前时间列的2个DataFrame 的行为.我的暴力解决方案是使用基本上做的包装程序[(key, df[key] for key in df.columns.levels[0]].有一个更好的方法吗?
应用
我还想做一些事情,比如"从其他人那里减去IWWGDW条目"来计算配对差异.我试着做df.apply(lambda f: f - df['IWWGDW'])但KeyError: ('IWWGDW', 'occurred at index 2010-11-26 12:00:00')不管我是否使用axis=1或得到 …